Разбор строк в C ++ с использованием типа данных char - PullRequest
1 голос
/ 13 февраля 2012

Я видел все примеры разбора, но все они используют строковые или другие случайные методы, которые не решат мою проблему.Моя проблема в том, что, когда я читаю из текстового файла, извлекаемые токены получаются с самим токеном плюс набор случайных букв и символов.Например, строка в текстовом файле гласит ... create_device digital_controller "Левая лампа поворота" 51 ... и я хочу иметь возможность указывать на каждый токен с помощью моего массива указателей * tklist [].Однако, когда я анализирую и указываю, я получаю - ... create_deviceýýýý «« «« «« «« þîþîþîþ ... ... вместе с получением токена друг друга подобным образом.Вот мой код для извлечения токенов.Предположим, что мои позиции токенов правильные, потому что я проверил и дважды проверил, что позиции находятся там, где они должны быть, иначе я бы только включил часть слова, которое я хочу, в беспорядок символов.cline объявлен как 'char cline []' и является массивом символов для строки

token_length = endTokenPosition - startTokenPosition;  //length of the token

tklist[next_token] = (char *)malloc(token_length + 1);  

memcpy(tklist[next_token], &cline[startTokenPosition], token_length + 1); 

cout << tklist[next_token] << endl;

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Вам нужен нулевой терминатор в конце вашей строки.

1 голос
/ 13 февраля 2012

Вы скопировали токен в tklist[next_token], но не завершили его нулевым символом, поэтому cout продолжается до конца. Вы можете попробовать либо:

memset(tklist[next_token], '\0', token_length + 1);
memcpy(tklist[next_token], &cline[startTokenPosition], token_length); 

или

memcpy(tklist[next_token], &cline[startTokenPosition], token_length); 
tklist[text_token][token_length] = '\0';
...