Scanf无法正确读取包含开头0的输入

时间:2018-12-05 01:09:41

标签: c scanf format-specifiers

我一直在尝试解决Code 2018 Day 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 :(得分:2)

更改此:

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,以便保持一致。

What is the difference between conversion specifiers %i and %d in formatted IO functions (*printf / *scanf)中了解更多吗?