所以我想知道如果用户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
。 什么事情都可能发生。
所以这里有两个教训:
检查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"
中的前导空格。