您可以通过两种方式修改代码以达到您想要的效果。首先,将printf更改为打印值的字符表示而不是整数表示。
printf("%c", str[i]);
当从键盘输入字符串"0"时,将打印出 "0"。
你在问题中提到的另一个是:
printf("%d", (int)(str[i]-'0'));
你之所以在这里得到正确的答案,是因为计算机存储值的方式。当你输入"0"时,它实际上并不会存储数值0,而是会存储我们称之为"0"的字符的ASCII表示。那个值恰好是整数48。49代表字符"1",以此类推。
为什么呢?想想如何表示字符"M"或者"#"。应该用什么来表示它们? ASCII是已知的256个字符(大约)的表示形式,因为这是我们可以在1字节中存储的总值的数量。因此,"M"是77,"#"是35。
str[i] - '0' 之所以起作用,是因为C/C++处理字符的方式('0'是一个字符)。字符'M'恰好等于值77。因此,以下两行代码等效:
str[i] - '0'
与
是相同的。
str[i] - 65
因为我输入了代表二进制数66的字符串“1”,我减去了65并得到了值为1的结果。当我要求printf显示我的结果的整数值(%d)时
printf("%d", (int)(str[i] - '0'));
它打印出 "1" 是因为 66 - 65 等于 1。或 '1' - '0' 等于 1。
记住,任何时候当你查看一个字符串或字符时,你并不是在查看值的数字或二进制表示,而是在查看该值的 ASCII 表示。
scanf("%19s",str);
,这样更安全。 - chqrlien
在0..9
范围内,'n' - '0' == n
。 - chqrlie