具有格式说明符和输入不匹配的Scanf

时间:2017-06-03 16:40:42

标签: c

使用%d说明符将字符传递给scanf会导致随机数大约为32,760。我正在使用Ubuntu 16.04提供的GCC。 我的猜测很明显,这是未指明的行为。但是有什么想法可以在幕后发生什么?

以上是上述目标的相当明显的代码:

#include <stdio.h>

void main() {
  int n;
  scanf("%d", &n);
  printf("\n%d", n);
}

提供的输入重复字母'a',然后按Enter键终止终端通话。前三次运行的结果是:32765,32764,32767。

为了回应一些有用的建议,我因此认为scanf没有初始化n。但它确实某事。 请考虑以下代码:

#include<stdio.h>   
int main() {
    int i;
    for(i=0; i<10; i++)
    {
        int n;
        printf("%d", n);
    }
}

这为输出提供了一行十个零。 我茫然不知所措。问题可能并不重要,我明白了。但我不能不停地想知道为什么。由于这个原因,我仍然无法排除scanf的影响。

1 个答案:

答案 0 :(得分:0)

我将您的计划更改为

#include <stdio.h>

int main() {
  int n;
  printf("%d\n", n);
  scanf("%d", &n);
  printf("%d\n", n);
}

当我使用输入&#34; a&#34;运行它时,它会打印

32767
32767

所以无论是什么导致n开始使用32767的位模式,都不是 scanf正在做的任何事情。

在某种程度上,这很有意思,甚至可能很有趣:尽管事实上我使用了一个非常不同的系统(在MacOS 10.9.5下铿锵600.0.57),我得到了一个非常相似的结果。但无论多么有趣,我都不会浪费时间去弄清楚原因,因为它很难,而且它也不会教会我编写正确程序的任何有用的东西。它只是一些随意的,毫无意义的巧合。