c fgets дублирует последний символ - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь прочитать целочисленные значения из стандартного ввода. У меня есть внутреннее время l oop, которое обнаруживает целочисленные ряды, чтобы я мог проанализировать целые числа с несколькими символами. Я strtok буфера с разделителями новой строки, потому что ввод может иметь целые числа в нескольких строках.

Мой код для обработки это:

while (fgets(buf, BUF_SIZE, stdin)) {
    strtok(buf, "\n");
    for(int i = 0; buf[i] != '\0'; i++) {
        size_t j = 0;
        if(isdigit(buf[i])) {
            while(isdigit(buf[i+(int)j])) {
                j++;
            }
            char *new_str = malloc(j*sizeof(char));
            size_t k =0;
            while(k < j) {
                new_str[k] = buf[i+(int)k];
                k++;
            }
            printf("%s\n", new_str);
            free(new_str);
        }
    }
}

Ввод может быть: 1 9 10 10 11

Вывод должен быть:

1
9 
10 
10 
11

Вывод, который я получаю:

1
9
10
0
10
0
11
1

Таким образом, каждый последний символ ввода с n> 1 дважды читается буфером способ.

Я не уверен, как это возможно, но не могу понять это.

1 Ответ

1 голос
/ 21 февраля 2020

Это происходит потому, что вы увеличиваете j над входной строкой, но вы забываете расти i вместе с j. Таким образом, вы увеличиваете j и после его печати вы увеличиваете i на 1 от последнего значения, и это i+1 попадет в уже введенную строку ввода ...

решение состоит в том, чтобы повторно инициализировать меня так:

        if(isdigit(buf[i])) {
          .....
          free(new_str);
          i = i+j;
        }
...