Проблемы с переменными в цикле while - PullRequest
0 голосов
/ 09 июня 2018

Моя простая программа считывается из текстового файла по одному слову за раз.

пример текстового файла.(ниже)

N 101001 Циклическая очередь 11 1

N 123456 Список компоновщика 11 5

N 666666 Псевдокод Gen 38 3

N 110010Растяжитель стека 3 2

и простые коды, включая переменные и т. Д. *

char function;
    int number, init_stock, reorder;
    char info[100];

    FILE *fp;
    if((fp = fopen("input.txt", "r")) == NULL)
    {
        printf("input open failed\n");
        return 0;
    }
    while(!feof(fp))
    {
        fscanf(fp, "%c %d %[A-z, ] %d %d ", &function, &number, info, &init_stock, &reorder);

    }

Когда переменная была изменена в цикле while,

Я ожидал, что это повлияет и на следующий цикл.

так что ... во-первых, "Круговая очередь" была сохранена в "info".

Во-вторых, когда 'List Linker' был сохранен в 'info' из-за того, что вторая строка короче первой строки,

Я думал, что в информационном массиве есть строка, подобная этой 'List Linkerue'.

  1. info - Циклический Que ue
  2. info - List Linker + ue

Но информация, казалось, сбрасывалась каждый раз, и я не знаю почему.

1 Ответ

0 голосов
/ 10 июня 2018

На первом проходе содержимое info равно "Circular Queue \0". \0 в конце представляет один нулевой байт, это нулевой символ.Это сообщает такие функции, как printf, где заканчивается строка.

Обратите внимание, что в конце также есть пробел.

На втором проходе содержимое info равно "List Linker \0e".Как вы и подозревали, fscanf не заполнила всю строку.Но он добавил нулевой символ, поэтому вы не можете увидеть e в конце.Содержимое info будет

1st pass: "Circular Queue " ... followed by random bytes
2nd pass: "List Linker \0e "

. Вы также можете улучшить свою функцию, изменив формат на %99[A-z, ], поскольку info равен 100 байтам (включая нулевой символ). И убедитесь, что fscanf читает5 значений, как и ожидалось.Вы также можете изменить вход, чтобы значения разделялись запятыми.

while(fscanf(fp, "%c %d %99[A-z, ] %d %d ", 
    &function, &number, info, &init_stock, &reorder) == 5)
{
    //optional: remove the extra space at the end of info
    int len = strlen(info);
    if(len)
        if(info[len - 1] == ' ')
            info[len - 1] = 0;
    printf("string: [%s] %d\n", info, number);
}
...