【问题标题】:Scanf not reading properly with input containing initial 0'sScanf 无法正确读取包含初始 0 的输入
【发布时间】:2019-05-06 12:24:42
【问题描述】:

我一直在尝试解决 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 一起使用,但两种替代方法的结果相同。

我在网上找了很多遍这个问题,但找不到很好的解释。

谁能帮我理解问题出在哪里?

【问题讨论】:

  • 尝试改用%d%i 会将带有前导零的数字解释为八进制。而且由于 9 不是八进制数字,所以会发生不好的事情。
  • 谢谢!那行得通。我知道这很愚蠢,但在其他任何地方都找不到。
  • linha++?那是不是您正在使用的代码,因为那个代码甚至不会编译。
  • 这是一个旧的时间戳1518 11 01 00 00 10
  • 我将“linha++”固定为“line++”。我只是翻译了代码以便更好地理解。关于旧的时间戳,它是正确的。这个谜题指的是旧的时间戳,它是一个虚构的问题。不过,这个问题已经解决了。在 cmets 中说,这很愚蠢。感谢您的所有帮助。

标签: c scanf format-specifiers


【解决方案1】:

改变这个:

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)了解更多信息?

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多