使用scanf和赋值读取变量之间的区别

时间:2010-08-22 12:45:24

标签: c

int main()
{
  int i,j;
  i='c';

  scanf("%d",&j);   // I will read 'c' here 

  printf("%d %d",i,j);

}

输出不相同。'j'获取垃圾值,'i'取{c}值的{c}值。任何人都可以说出原因是什么?

3 个答案:

答案 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

现在你有另一个问题。 jint,但您正在阅读charchar通常小于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'charjint,并且会为您执行正确的转换,包括将高位清零。< / p>

答案 2 :(得分:0)

你没有把任何东西都读成j。我的猜测是j将由你的编译器和输出0进行零初始化。因为我们真的不知道,在你的情况下,j实际打印出来的是什么 - 我们只能假设是这种情况。在你的另一个例子中,我可能打印出'c'的ascii值为99.如果你想将一个字符读入j,那么你还需要将%d更改为%c。但我的猜测是你真的不打算用j而它会被我取代所以你可以比较差异。