C中格式说明符的不同输出

ord*_*ary 1 c c++ printf scanf

int x;
scanf("%d",&x);
printf("%d",x);

Input: . (just a period)
Output: 4096
Run Code Online (Sandbox Code Playgroud)

为什么它在这里输出4096.这就是我的想法:所以一段时间的ASCII值是46.输入后,它读入x作为46的位模式?当它打印时,它是否在x的存储位置打印出四个字节,所以只有第一个字节用对应于46的位模式填充,其余的是构成4096的随机内容?但这是不正确的,因为看看我这样做会发生什么 -

int x;
scanf("%d",&x);
printf("%c",x);

Input: . (period)
Output: (nothing)

Input: 46
Output: . (period)
Run Code Online (Sandbox Code Playgroud)

当我这样做时,更令人困惑的是:

int x;
scanf("%c",&x);
printf("%d",x);

Input: . (period)
Output: 4142

Input: 46
Output: 4148

Input: 47
Output: 4148
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

您需要检查scanf的返回值(它是成功读取值的计数):

int x;

if (scanf("%d",&x) == 1) {
    printf("%d", x);
} else {
    printf("Invalid input.");
}
Run Code Online (Sandbox Code Playgroud)

如果解析失败,则不定义x的值.

一旦scanf失败,进一步的调用也将失败,因为未从流中删除无效输入.因此,使用它不是一个好主意scanf.