Scanf не читает правильно с вводом, содержащим начальные 0 - PullRequest
0 голосов
/ 05 декабря 2018

Я пытался решить головоломку Advent of Code 2018, день 4.

Я много борюсь с чтением ввода проблемы, и хотя мне удалось обойти это, я все ещехотел бы понять причину моей проблемы.

Каждая строка ввода имеет метку времени и событие, как в следующем примере:

[1518-11-01 00:00] Guard #10 begins shift
[1518-11-01 00:05] falls asleep
[1518-11-01 00:25] wakes up

Реальный ввод имел более1000 строк.

Чтобы упростить задачу, я манипулировал этим вводом, чтобы он содержал только цифры, где «1» и «2» обозначают сон и пробуждение и т. Д.

С тем жеПример сверху, я получил:

1518 11 01 00 00 10
1518 11 01 00 05 1
1518 11 01 00 25 2

Я проверял раньше и нет охранника номер 1 или 2. Мой код чтения следует, написанный на C:

#include <stdio.h>
#include <string.h>
int main () {
int line=0;
int year, month, day, hour,minute, action=0;

while (line<1110){
        scanf("%i %i %i %i %i %i",&year, &month,&day,&hour,&minute, &action);
        printf("%i %i %i %i %i %i\n",year, month,day,hour,minute, action);
        }
        line++;
}
return 0;

Дляпочему-то, после 27 правильно прочитанных строк, переменные начали не правильно храниться:

1518 2 17 23 56 1297 //last correct line read
1518 2 18 0 0 9 //First incorrect line read
1518 2 18 00 09 -1 //What the first incorrect line should be.

Я в конечном итоге заставил его работать, удалив все начальные нули (т.е. заменив 00 на 0, 01 на 1 и так далее...) но это не имело никакого смысла, так как былизначения с начальными нулями в первых строках, которые были прочитаны правильно.

Я пытался использовать fscanf и fgets с sscanf, но оба альтернативных способа имели одинаковый результат.

Я посмотрелдля этого вопроса много в Интернете, но не мог найти хорошее объяснение.

Может кто-нибудь помочь мне понять, в чем была проблема?

1 Ответ

0 голосов
/ 06 декабря 2018

Измените это:

scanf("%i %i %i %i %i %i",&year, &month,&day,&hour,&minute, &action);

на это:

scanf("%d %d %d %d %d %d", &year, &month, &day, &hour, &minute, &action);

Спецификатор формата i будет интерпретировать число с начальным нулем как восьмеричное.А поскольку 9 не является восьмеричной цифрой, она не сможет ее обработать, как сказал @ user3386109.

Для печати не имеет значения, какой из них вы выберете, но я бы выбрал %d, чтобы быть однородным.

Подробнее в В чем разница между спецификаторами преобразования% i и% d в форматированных функциях ввода-вывода (* printf / * scanf) ?

...