小C程序工作

时间:2014-05-30 06:04:39

标签: c

  

Practice.c

#include <stdio.h>

main()
{
  char a;

  printf("\nEnter Anything = ");
  scanf("%c",&a);                  <Line 1>

  printf("\n%d",a);
  printf("\n%c",a);
}

Output 1 : Enter Character = 5

           53
           5
Output 2 : Enter Character = a

           97
           a

这个程序完全由本书执行。


  

New.c

#include <stdio.h>

main()
{
  char a;

  printf("\nEnter Character = ");
  scanf("%d",&a);                <Line 1>

  printf("\n%d",a);
  printf("\n%c",a);
}

Output 1 : Enter Character = 5

           5
           ♣
Output 2 : Enter Character = a

           0

这与Practice.c的程序相同,只是稍作修改。这不是问题,但我错误地在程序%d表示的行中键入%c而不是Line 1。我的这个错误产生了2个非常不同的输出。它背后的确切原因是什么?

4 个答案:

答案 0 :(得分:2)

在ASCII 32下面,所有都是不可打印的字符。在第二个代码中,您正在读取int,然后尝试打印不可打印的等效字符。

对于第二个输入ascanf不读取此字符并将其保留在缓冲区中,因为它需要整数而不是字符。变量a未初始化,您现在正在访问未初始化的变量。这会调用未定义的行为

答案 1 :(得分:1)

字符数据类型的大小为1个字节,而整数通常为4个字节。在这里,您尝试将字符变量读入整数。没有足够的存储空间来妥善处理这个问题。结果取决于您的体系结构是否支持小端或大端符号。

答案 2 :(得分:1)

当您使用%c时,输入将被视为字符并存储其ASCII值。

使用%d时,输入将被视为整数。

使用%c进行打印时,会尝试以给定值打印ASCII char。

使用%d进行打印时,会尝试打印该数字。

答案 3 :(得分:1)

您的新计划中发生的事情是

scanf("%d",&a);

读取时的格式说明符以整数%d给出,因此编译器将输入值假定为整数,即使它存储在char变量中,因此变量的值将为  a = 0x05,这是一个整数5

  printf("\n%d",a);

打印变量a作为整数在输出上打印5

  printf("\n%c",a);

我想你知道,当一个数字作为一个字符读取时(使用%c),它的ASCII值被存储(例如:scanf("%c",&a));,你输入 a 为5 ,存储在变量 a 中的值是 a = 0x35(十六进制),或53作为整数表示

打印变量as character-&gt;因为0x05不是ASCII值中的字符或数字,所以它在输出上打印特殊字符

关于ASCII表的

参考:http://www.asciitable.com/