【问题标题】:can anyone explain how getchar is being used here to take input of sequence of number?谁能解释这里如何使用 getchar 来输入数字序列?
【发布时间】:2020-04-01 05:17:55
【问题描述】:

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

【问题讨论】:

  • ASCII Table and Description 的快速回顾应该清楚发生了什么。尽管使用- '0'- 48 更具可读性(课程——总是使用character-literal 而不是它的ASCII 值)。无需转换 (int)getchar() -- getchar() 的返回类型已经是 int
  • 你真的应该缩进你的代码。
  • 具有讽刺意味的是在所有尴尬的背后,基本逻辑还不错(它实际上涵盖了 EOF 和非数字输入)。然而,由于编写方式笨拙,代码中好的部分几乎无法辨认。

标签: c io getchar


【解决方案1】:

在 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 &lt;= digit &amp;&amp; digit &lt;= 9)&lt;ctype.h&gt; 标头提供了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.

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

【讨论】:

    【解决方案2】:

    查看下面的示例代码

    #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。

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2021-02-27
      相关资源
      最近更新 更多