Scanf 无法正确读取包含初始 0 的输入
Scanf not reading properly with input containing initial 0's
我一直在尝试解决 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 一起使用,但两种替代方法的结果相同。
我在网上找了很多这个问题,但找不到很好的解释。
有人可以帮助我了解问题出在哪里吗?
改变这个:
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) 阅读更多内容?
我一直在尝试解决 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 一起使用,但两种替代方法的结果相同。
我在网上找了很多这个问题,但找不到很好的解释。
有人可以帮助我了解问题出在哪里吗?
改变这个:
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) 阅读更多内容?