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

查看代码和逻辑,如果您还有其他问题,请告诉我。