谁能解释一下这里如何使用getchar来输入数字序列?
main()
{
int digit;
int number;
digit = (int) getchar() - 48;
number = 0;
for (; (digit >= 0) && (digit <= 9); )
{
number = number * 10 + digit;
digit = (int) getchar() - 48;
}
printf("%dn", number);
}
当在C 中获取用户输入或从文本文件中读取时,所有输入都是字符输入 - 即使读取的字符是"123"
的(ASCII 字符将'1'
、'2'
和'3'
) 如果您查看 ASCII 表和描述,您将看到具有 ASCII 值的数字字符(以十进制显示, 八进制和十六进制):
Char Dec Oct Hex
---------------------
0 48 0060 0x30
1 49 0061 0x31
2 50 0062 0x32
3 51 0063 0x33
4 52 0064 0x34
5 53 0065 0x35
6 54 0066 0x36
7 55 0067 0x37
8 56 0070 0x38
9 57 0071 0x39
这些只是上面显示'0' - '9'
的每个字符的 ASCII 代码
所以你读一个ASCII字符,其中一个带getchar()
的数字,那么你如何得到这个数字的整数值?意思是如何将字符'1
整数1
?由于'0'
的 ASCII 字符的 ASCII 十进制值为48
,如果你想从 ASCII 数字'0'
中获取整数0
,您只需从中减去'0'
的 ASCII 字符值。(这使得当你从字符'0'
中获取整数0
时,你只需从自身减去它,留下零。
对于其他 ASCII 数字'1' - '9'
,请注意它们在字符集中'0'
之后的顺序排列。因此,如果 ASCII'1'
具有十进制值49
并且您想从中获取1
整数值,您必须从49
中减去什么数字才能得到1
?(提示:48
或可读'0'
)。因此,从 ASCII 数字中减去0
的 ASCII 值都会导致该 ASCII 数字转换为其整数值。
你的代码的逻辑还不错,但它写得非常笨拙。每当您对 C 函数的工作原理有疑问时,请阅读该函数的手册页,例如 man 3 fgetc。在那里你会看到getchar()
的返回类型已经int
所以没有必要将getchar()
的返回转换为(int)
,这是多余的。
您的循环只是将当前number
乘以10
然后将新整数添加到该数字中,以便您从输入中读取的每个 ASCII 数字中构建最终整数值。与手动比较(0 <= digit && digit <= 9)
不同,<ctype.h>
标头提供了以标准方式提供该测试的isdigit()
宏。此外,如注释中所述,不要做- 48
而是通过使用字符文字来使您正在做的事情可读,例如digit - '0'
很容易识别为ASCII数字到其整数值的转换。
将所有这些部分放在一起,您可以执行以下操作:
#include <stdio.h>
#include <ctype.h>
int main (void) {
int digit = getchar(), /* read 1st character from stdin */
number = 0; /* initialize number zero */
if (digit == EOF || !isdigit(digit)) { /* validate not EOF and digit */
fputs ("error: manual EOF or non-digit input.n", stderr);
return 1;
}
digit -= '0'; /* subtract ASCII val for '0' from digit to obtain integer value */
while (1) { /* loop continually reading digits */
number = number * 10 + digit; /* add current digit to number */
if (!isdigit(digit = getchar())) /* read next digit, validate digit */
break; /* on non-digit; break loop */
digit -= '0'; /* subtract '0' for integer value */
}
printf("%dn", number); /* output integer that results from digit conversion */
}
示例使用/输出
通过一些示例数字和字母,您可以看到该函数的工作原理:
$ echo "135" | ./bin/atoimin
135
$ echo "23a" | ./bin/atoimin
23
(注意:在处理数字后找到非数字时,字符提取如何停止。
但是看看当非数字是第一个字符时会发生什么:
$ echo "a23" | ./bin/atoimin
error: manual EOF or non-digit input.
查看代码和逻辑,如果您有其他问题,请告诉我。
请参阅下面的示例代码
#include<stdio.h>
int main()
{
int n=0;
char ch=getchar();
n=(ch-'0');
printf("%d",n);
return 0;
}
注意:您的输入必须是 1 位数字,范围仅为 0-9。
假设您给出输入 5,'5'
的 ASCII 值为 53,'0'
的 ASCII 值为 48
所以
53-48=5
所以 n 的值是 5。