#c #parsing #token
#c #синтаксический анализ #токен
Вопрос:
У меня есть текстовый файл с выводом, похожим на этот стиль:
некоторый текст 10 испытаний, другой текст здесь 12 испытаний и немного больше текстовых испытаний 20
некоторый текст здесь 7 испытаний текст 16 испытаний и более 20 испытаний txt
и т.д.
То, что я пытаюсь сделать, это получить значения до испытаний У меня есть код, который работает теоретически, но ломается, потому что текст обрабатывается не так, как при запуске strcmp()
char *fileToString(char *fileName){
FILE *file = fopen(fileName, "rb");
long lSize;
fseek(file, 0, SEEK_END);
lSize = ftell(file);
fseek(file, 0, SEEK_SET);
char *buffer = malloc(lSize);
fread(buffer, 1, lSize, file);
fclose(file);
return buffer;
}
Основной выглядит примерно так.
path[20] = "path/to/file.txt";
char *a = fileToString(path);
char trial[6] = "trials";
char *token, *tmp;
token = strtok(a, " n");
tmp = token;
while(token != NULL){
if(strcmp(token, trial)==0){
printf("%s trialsn", tmp);
}
printf("tmp: %s | token %s | strcmp %dn", tmp, token, strcmp(token,trial));
tmp = token;
token = strtok(NULL, " n");
}
Результат должен быть
10 trials
12 trials
20 trials
7 trials
16 trials
20 trials
и т.д. Но strcmp(token, trial)
иногда дает мне ненулевое значение, даже когда token
и trial
должны совпадать. Когда я напечатал strcmp()
значения, вот что я получил в результате
tmp: 12 | token trials | strcmp -81
...
Ответ №1:
Обратите внимание на
char trial[6] = "trials";
Здесь trial[6]
должны trial[7]
храниться не только буквы, но и ''
(конец строки)
Комментарии:
1. В качестве альтернативы
char *trial = "trials"
, который не указывает длину, а просто присваивает указатель.2. Я бы также не стал вызывать
''
«конец строки». Новая строка или конец строки — это'n'
. Я бы вызвал''
завершающий байт или символ.3. Или
char trial[] = "trials";
который автоматически выделяет правильное количество символов.