Получение параметров с помощью токенов в массиве символов

#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"; который автоматически выделяет правильное количество символов.