sscanf пропускает окончательное значение при чтении нескольких значений из строки - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь получить данные из файла, файл отформатирован и имеет 5 значений в строке, код считывает только первые 4 и переходит к следующей строке.

Файл отформатирован следующим образом:

1 | 1 | 1 | qwqqqqqqqq | q |
2 | 2 | 2 | a | a |
3 | 3 | 3 | e | e |
(this line has nothing)
 char buffer[100];
 for(int i=0; i<numofline; i++)
    {
        fgets(buffer,100,fr);

        sscanf(buffer,"%d | %d | %d | %[^|]s | %[^|]s |\n", &dump, &sa[i].v1, &sa[i].v2,sa[i].v3, sa[i].v4);

        printf("%-5d%-5d%-5d%-20s%-20s\n", dump, sa[i].v1, sa[i].v2,sa[i].v3,sa[i].v4);
     }

Я ожидаю, что результат будет похож на файл, который равен

1    1    1    qwqqqqqqqq  q
2    2    2    a           a
3    3    3    e           e

, но в фактическом результате отсутствует последний столбец

1    1    1    qwqqqqqqqq
2    2    2    a         
3    3    3    e         

1 Ответ

5 голосов
/ 10 мая 2019

%[^|]s всегда терпит неудачу, потому что %[^|] потребляет все непотоковые символы, включая s, поэтому s затем никогда не совпадает.

То есть %[^|] является входной директивой scanf, ноs в строке формата просто соответствует самому себе.Просто удалите это s.

Кроме того, всегда проверяйте возвращаемое значение scanf, чтобы увидеть, сколько переменных было успешно заполнено.

if (sscanf(buffer, "%d | %d | %d | %[^|] | %[^|] |",
                   &dump, &sa[i].v1, &sa[i].v2, sa[i].v3, sa[i].v4) != 5) {
    /* handle input error somehow */
}
...