C - 谁能解释一下这里如何使用 getchar 来输入数字序列?



谁能解释一下这里如何使用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。

最新更新