【问题标题】:Why does this code output a 64 if the input is a character? [duplicate]如果输入是字符,为什么这段代码会输出 64? [复制]
【发布时间】:2016-06-10 19:02:06
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

//A simple program that asks for an integer and prints it back out.

int main()
{
    int a; 
    printf("Type an integer: ");
    scanf("%d",&a);
    printf("The integer you typed is: %d",a);
}

如果用户输入一个字符,例如X,那么出于某种原因,输出将始终为 64。为什么会这样?

【问题讨论】:

  • @CherubimAnand:这不是 ASCII 的东西。 X 甚至不是 ASCII 64。
  • @user2357112 是的……它未定义的行为……我弄错了
  • 除了 Sourav 所说的,验证输入(或函数中的参数)总是一个好主意。如果收到的不是您想要的,请给出警告或错误消息。这对于帮助调试更健壮的问题特别有用。

标签: c scanf


【解决方案1】:

这会调用undefined behavior

如果scanf() 发生匹配失败(“X”与%d 不匹配),则提供的参数保持未赋值,并且由于参数是未初始化的局部变量,因此值保持不确定。

相关,来自C11,第 7.21.6.2 章

[...] 如果 输入项不是匹配序列,指令执行失败:this 条件是匹配失败。 [...]

尝试使用该值会调用 UB。来自C11 附件 J.2,未定义的行为

具有自动存储持续时间的对象的值在它被使用时使用 不确定。

因此,您应该始终

  1. 初始化局部变量
  2. 检查scanf()的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多