如果C尝试扫描整型variables中的字符,会发生什么情况

所以我想知道如果用户input整数variables字符会发生什么,例如:

main() { int number; printf("Print a number:"); scanf(" %d", &number); printf("The result is:%d", number); return 0; } 

我input了字符,结果是:1986895412

这是1986895412在公羊的地方?

在这种情况下, scanf指令只是失败。 引用这个答案 (基本上重新定义规范的定义):

%d转换说明符需要将输入文本格式化为十进制整数。 如果不是,则转换失败,导致转换失败的字符将保留在输入流中。

所以, number仍然与指令前的值相同。 因为您没有使用某个定义的值(如int number = 0 )初始化它,所以它只是一些随机垃圾值。 在你的情况下,碰巧等于1986895412

由于编号尚未初始化,并且scanf()失败, printf()会引发未定义的行为读取未初始化的变量number 。 什么事情都可能发生。

所以这里有两个教训:

  1. 在定义变量时初始化变量。 (如果你不知道如何初始化它们,你可能不需要它们,至少不是你想要定义它们的地方)
  2. 执行错误检查,如果失败将返回垃圾。

检查scanf()的返回。 当输入字符时,会出现相应的结果。

 if (1 == scanf("%d", &number)) { printf("The result is:%d", number); } else { printf("Invalid data entered. `number` not changed\n"); } 

注意:代码的int number; 没有初始化,所以它的值可以是任何int 。 输入无效时, number未被更改,代码打印出刚刚发生的值为“1986895412”的未初始化number 。 明天可能会有所不同。

注意:由于%d本身消耗前导空白,因此不需要" %d"中的前导空格。