int main(){
char c;
scanf("%c", &c);
printf("%d\n", c);
}
假设用户输入71
并点击输入。
为什么c
不成为71
,为什么它只能读取7
而不是1
?
答案 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位整数,表示以下之一:
\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。