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

Input: . (just a period)
Output: 4096

为什么这里输出4096。这就是我的想法:所以一个句点的 ASCII 值是 46。在输入时,它读入 x 作为 46 的位模式?而当它打印的时候,是不是在x的内存位置打印出四个字节,所以只有第一个字节填充了46对应的位模式,其余的都是组成4096的随机东西?但这是不正确的,因为看看我这样做时会发生什么——

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

Input: . (period)
Output: (nothing)

Input: 46
Output: . (period)

更令人困惑的是当我这样做时发生了什么:

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

Input: . (period)
Output: 4142

Input: 46
Output: 4148

Input: 47
Output: 4148
4

1 回答 1

7

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

int x;

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

如果解析失败,则 x 的值未定义。

一旦scanf失败,进一步的调用也将失败,因为无效输入没有从流中删除。因此,使用scanf.

于 2012-06-29T18:55:24.810 回答