一个2+数字字符的Scanf值?

时间:2017-02-14 17:05:30

标签: c

    int main(){
  char c;
  scanf("%c", &c);
  printf("%d\n", c);
}

假设用户输入71并点击输入。

为什么c不成为71,为什么它只能读取7而不是1

3 个答案:

答案 0 :(得分:1)

'7'是一个字符,'1'是一个字符。字符“G”的小数值为71.输入“G”,您将获得71.如果您想扫描一个数字,您可以:

int i;
scanf("%d", &i);
printf("Value %d = char(%c)", i, (char)i);

一旦系统扫描到'7',它就会有一个等待的字符并停止收听 - 你的'1'还没有被“扫描”过来!

答案 1 :(得分:1)

声明

scanf ("%c", &c);

表示“从标准输入读取一个字节并将其放入变量c”。没有转换。在您的示例中,字节为'7',假设程序在使用ASCII(或超集,如UTF-8)字符编码的语言环境中运行,则与'\x37'相同,或55。请注意,分配给c的值取决于当前区域设置使用的字符编码。

通过比较,语句如

scanf ("%d", &i);

表示“读取一个或多个字符表示标准输入的十进制数字,将这些十进制数字转换为整数值,并将该值存储在变量i”中。请注意,分配给变量i的值不依赖于当前语言环境使用的字符编码,当然标准输入使用程序所需的编码。

答案 2 :(得分:0)

您似乎缺少一些重要的区别。

scanf函数将一串字符作为输入。每个字符都是一个8位整数,表示以下之一:

  • 可打印的字形,例如“7”,“1”或“G”
  • 控制字符,例如换行符('\ n')或bel('\ a')
  • nul终结符(\0),用于标记字符串的结尾。

(为简单起见,我假设使用ASCII,其他编码可用)。

打印时,可打印字符在屏幕上显示为字母,数字或符号。控制字符控制终端/显示设备的作用(换行使其将名义光标移动到下一行,并且bel使一些终端发出可听见的哔声)。

scanf对此输入字符串的作用由格式字符串控制:

  • %c将传入的字符无需转换读入char值。

  • %d将范围为“0”,“9”(即值0x30..0x39)的字符序列转换为整数。

因此,当字符'7'被扫描为具有%c的字符时,它给出值0x37(十进制55)仍然假定为ASCII。 将同一字符扫描为%d的整数时,取值为7。

如果要扫描字符串“71”,作为整数值,请使用%d(或%hhd如果由于某种原因您确实要将其存储在char中。

现在,最后,我们可以解决这个问题:

  

...如果一个整数只有4个字节,我该如何扫描一个5位整数?

让我们考虑字符串文字“12345”,它以

的形式存储在内存中
const char literal[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x00};

如果用%d扫描,那么这5个非空字节将被转换为基数为10的整数到值12345。

但是,如果使用%5c扫描相同的字符串,则将使用值{0x31, 0x32, 0x33, 0x34, 0x35}填充5-char缓冲区。如果您尝试使用普通%c,它当然只会读取第一个字符,即0x31。