谁能解释这里如何使用 getchar 来输入数字序列?
can anyone explain how getchar is being used here to take input of sequence of number?
谁能解释一下这里如何使用 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("%d\n", number);
}
查看下面的示例代码
#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。
当在 C 中接受用户输入或从文本文件中读取时,所有输入都是字符输入——即使读取的字符是 "123"
(这将是 ASCII 字符 '1'
, '2'
和 '3'
) 如果您查看 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
这些只是上面显示的每个字符的 ASCII 代码 '0' - '9'
所以你读取了一个ASCII字符,其中一个带有getchar()
的数字,那么你如何得到那个数字的整数值呢?意思是如何将字符 '1
转换为整数 1
?由于 '0'
的 ASCII 字符具有 48
的 ASCII 十进制值,如果您想从 ASCII 数字 '0'
中获得整数 0
,只需减去 ASCII 字符即可'0'
的值。 (这使得当你想从字符 '0'
中获取整数 0
时,你只需从它自身中减去它而留下零。
对于其他ASCII数字'1' - '9'
,请注意它们在字符集中'0'
之后的顺序。因此,如果 ASCII '1'
具有十进制值 49
,并且您想从中获取整数值 1
,那么您必须从 49
中减去多少数字才能得到1
? (提示:48
或可读的 '0'
)。因此,所有从您的 ASCII 数字中减去 0
的 ASCII 值都会导致将该 ASCII 数字转换为其整数值。
你的代码逻辑不错,但是写的很别扭。每当您对 C 函数的工作原理有疑问时,请阅读该函数的 man-page,例如man 3 fgetc。在那里你会看到 getchar()
的 return 类型已经是 int
所以没有必要将 getchar()
的 return 转换为 (int)
,多此一举。
您的循环只是将当前的 number
乘以 10
,然后将新整数添加到该数字,这样您就可以根据从输入中读取的每个 ASCII 数字构建最终整数值. <ctype.h>
header 提供了 isdigit()
宏,而不是手动比较 (0 <= digit && digit <= 9)
,以标准方式提供该测试。此外,如评论中所述,不要使用 - 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 */
}
例子Use/Output
通过一些示例数字和字母,您可以了解该函数的工作原理:
$ echo "135" | ./bin/atoimin
135
$ echo "23a" | ./bin/atoimin
23
(注意:当一个数字已经被处理后发现 non-digit 时,字符提取如何停止。)
但看看当 non-digit 是第一个字符时会发生什么:
$ echo "a23" | ./bin/atoimin
error: manual EOF or non-digit input.
查看代码和逻辑,如果您还有其他问题,请告诉我。
谁能解释一下这里如何使用 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("%d\n", number);
}
查看下面的示例代码
#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。
当在 C 中接受用户输入或从文本文件中读取时,所有输入都是字符输入——即使读取的字符是 "123"
(这将是 ASCII 字符 '1'
, '2'
和 '3'
) 如果您查看 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
这些只是上面显示的每个字符的 ASCII 代码 '0' - '9'
所以你读取了一个ASCII字符,其中一个带有getchar()
的数字,那么你如何得到那个数字的整数值呢?意思是如何将字符 '1
转换为整数 1
?由于 '0'
的 ASCII 字符具有 48
的 ASCII 十进制值,如果您想从 ASCII 数字 '0'
中获得整数 0
,只需减去 ASCII 字符即可'0'
的值。 (这使得当你想从字符 '0'
中获取整数 0
时,你只需从它自身中减去它而留下零。
对于其他ASCII数字'1' - '9'
,请注意它们在字符集中'0'
之后的顺序。因此,如果 ASCII '1'
具有十进制值 49
,并且您想从中获取整数值 1
,那么您必须从 49
中减去多少数字才能得到1
? (提示:48
或可读的 '0'
)。因此,所有从您的 ASCII 数字中减去 0
的 ASCII 值都会导致将该 ASCII 数字转换为其整数值。
你的代码逻辑不错,但是写的很别扭。每当您对 C 函数的工作原理有疑问时,请阅读该函数的 man-page,例如man 3 fgetc。在那里你会看到 getchar()
的 return 类型已经是 int
所以没有必要将 getchar()
的 return 转换为 (int)
,多此一举。
您的循环只是将当前的 number
乘以 10
,然后将新整数添加到该数字,这样您就可以根据从输入中读取的每个 ASCII 数字构建最终整数值. <ctype.h>
header 提供了 isdigit()
宏,而不是手动比较 (0 <= digit && digit <= 9)
,以标准方式提供该测试。此外,如评论中所述,不要使用 - 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 */
}
例子Use/Output
通过一些示例数字和字母,您可以了解该函数的工作原理:
$ echo "135" | ./bin/atoimin
135
$ echo "23a" | ./bin/atoimin
23
(注意:当一个数字已经被处理后发现 non-digit 时,字符提取如何停止。)
但看看当 non-digit 是第一个字符时会发生什么:
$ echo "a23" | ./bin/atoimin
error: manual EOF or non-digit input.
查看代码和逻辑,如果您还有其他问题,请告诉我。