int main()
{
int i,j;
i='c';
scanf("%d",&j); // I will read 'c' here
printf("%d %d",i,j);
}
输出不相同。'j'
获取垃圾值,'i'
取{c}值的{c}值。任何人都可以说出原因是什么?
答案 0 :(得分:6)
您scanf
说:
scanf("%d", &j);
使用这句话scanf
将尝试将您用作函数输入的'c'字符解析(转换)为数字。这就是你得到垃圾的方式。 C不知道如何将'c'变成数字,因为scanf
期待数字。
尝试将其更改为:
scanf("%c", &j);
如果您的printf
电话是这样的话:
printf("%d %d", i, j);
两次都应该得到相同的值:'c'字符的ASCII值。
答案 1 :(得分:1)
这里有两个问题。
首先,您使用scanf
致电%d
。这意味着scanf
将查找小数字符并将其放在j
中。它找不到任何内容,因此它会保持j
不变。
您需要做的第一件事是将%d
更改为%c
。
现在你有另一个问题。 j
是int
,但您正在阅读char
。 char
通常小于int
。通常,char
是8位,而int
是32位或64位。现在会发生的是scanf
会将'c'
的ascii值放入j
的低位字节,但其余部分保持不变。
您需要明确地清除j
:
int j = 0;
或将其声明为char:
char j;
这显示了分配int
或使用scanf
之间的区别。 scanf
函数不知道j
是int。它根据格式字符串猜测发送给它的指针。当您使用%c
格式时,您告诉scanf
将&j
视为指向字符的指针,而如果您明确指定了
j = 'c'
编译器知道'c'
是char
而j
是int
,并且会为您执行正确的转换,包括将高位清零。< / p>
答案 2 :(得分:0)
你没有把任何东西都读成j。我的猜测是j将由你的编译器和输出0进行零初始化。因为我们真的不知道,在你的情况下,j实际打印出来的是什么 - 我们只能假设是这种情况。在你的另一个例子中,我可能打印出'c'的ascii值为99.如果你想将一个字符读入j,那么你还需要将%d更改为%c。但我的猜测是你真的不打算用j而它会被我取代所以你可以比较差异。