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
最佳答案
需要查看scanf的返回值(即读取成功的次数):
int x;
if (scanf("%d",&x) == 1) {
printf("%d", x);
} else {
printf("Invalid input.");
}
如果解析失败,则没有定义x的值。
一旦 scanf
失败,进一步的调用也将失败,因为无效输入未从流中移除。因此,使用 scanf
并不是一个好主意。
关于c++ - C 中带有格式说明符的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267423/