如果C尝试扫描整数变量中的字符会发生什么

时间:2013-12-18 10:19:20

标签: c unix initialization scanf

所以我想知道如果用户在整数变量中输入字符会发生什么,例如:

main()
{

    int number;

    printf("Print a number:");
    scanf(" %d", &number);
    printf("The result is:%d", number);

    return 0;
}

我输入了字符,结果是:1986895412

这是1986895412在公羊的一个地方吗?

3 个答案:

答案 0 :(得分:7)

在这种情况下,scanf指令失败。引用this answer(基本上改述了规范的定义):

  

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

因此,number保留与指令之前的值相同。由于您没有使用某个定义的值(如int number = 0)对其进行初始化,因此它只是一些随机垃圾值。在你的情况下碰巧等于1986895412

答案 1 :(得分:1)

检查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未更改,代码会打印未初始化的number,其刚刚发生的值为“1986895412”。明天可能会有所不同。

注意:不需要" %d"中的前导空格,因为%d本身会消耗前导空格。

答案 2 :(得分:0)

由于数字尚未初始化且scanf()失败,printf()会引发未定义的行为,读取未初始化的变量number。任何事情都可能发生。

所以这里有两个要吸取的教训:

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