在 C 语言中获取用户输入或从文本文件中读取时,所有输入都是字符输入——即使读取的字符是 "123"(ASCII 字符 '1'、'2' 和 @987654326 @) 如果您查看ASCII Table and Description,您会看到数字字符具有 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 字符具有48 的ASCII 十进制值,如果您想从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() 宏,它以标准方式提供该测试。此外,如 cmets 中所述,不要使用 - 48,而是使用 character-literal 使您正在做的事情变得可读,例如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("%d\n", 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.
查看代码和逻辑,如果您还有其他问题,请告诉我。