【问题标题】:Get whole number from input using only getchar() and convert to int仅使用 getchar() 从输入中获取整数并转换为 int
【发布时间】:2014-05-08 15:52:16
【问题描述】:

对于学校作业,我必须编写一个读取整数的 C 程序,该数字前面可能有一个“+”或“-”。我只能使用 getchar()。 我可以使用int i = ch - '0' 将单个字符转换为整数,但我想读取多个字符。除此之外,我需要检查输入是否正确(例如,没有非数字字符)

到目前为止我有这个:

int main(void) {
    int i;
    char ch;

    printf("voer een getal in: ");

    while ((ch = getchar()) != '\n') {
        i = ch - '0';

    }

    printf("het ingevoerde getal is: %d\n", i);
    return EXIT_SUCCES;
}

编辑:我知道这不是真正解决此类问题的地方(我应该学会自己解决它,而不是让其他人为我解决它)但我不知道该怎么办了。谢谢你指引我正确的道路

【问题讨论】:

  • 提示:423 = 4*100 + 2*10 + 3.
  • @herohuyongtao 提示应该在哪里帮助我?编辑:啊,我明白了,但是我如何仅使用 getchar 获得多个字符?
  • 试着自己弄清楚。
  • 首先,将i = ch-'0' 替换为i = 10*i+ch-'0'。您仍然需要处理最初的 +/- 字符问题,以及断言输入正确性...

标签: c int getchar


【解决方案1】:

这应该让你开始:

int main(void) {
    int i = 0;
    int ch;

    printf("voer een getal in: ");

    while ((ch = getchar()) != '\n') {
        if (ch > '9' || ch < '0')
            continue; // or print an error and exit
        i *= 10;
        i += ch - '0';
    }

    printf("het ingevoerde getal is: %d\n", i);
    return EXIT_SUCCES;
}

我将把检测潜在的+ / - 标志作为练习。

【讨论】:

    【解决方案2】:

    如果您的学校允许您使用移位运算符,那么这里是一种从用户那里获取整数的快速方法,并且根据他们的要求,您可以在整数前显示 + 或 - 号。但请记住不要只是复制粘贴它。先看懂代码。

        int main(){
            int i = 0;
            char c;
            char sign = 43;
    
            printf("voer een getal in:\n");
            c = getchar(); 
            if(c == 45)
               sign = 45;
            for(; (c<48 || c>57); c = getchar());
            for(; c>47 && c<58 ; c = getchar()){
                i = (i<<1) + (i<<3) + c - 48;
            }
            printf("het ingevoerde getal is: %c%d\n",sign, i);
    
            return 0;
        }
    

    【讨论】:

      【解决方案3】:

      读取多个字符,判断是正、负、值:

       int sign = 1;
       ch = getchar(); //look at first char (might be a sign indicator)
       if((ch == '-') || (ch == '+')) //consume first char if either `-` or `+`
       {
            if(ch == '-') sign = -1;
       }
       else  //first char non-sign - handle as digit
       {
           if (ch > '9' || ch < '0')
                  continue; // or print an error and exit
           i *= 10;
           i += ch - '0';
       }
       while ((ch = getchar()) != '\n') //get remaining chars (assume no embedded sign chars)
       {
           if (ch > '9' || ch < '0')
                  continue; // or print an error and exit
           i *= 10;
           i += ch - '0';
       }
       i *= sign; //apply sign to value
      

      【讨论】:

        【解决方案4】:

        我认为这会奏效。

            while ((ch = getchar()) != '\n') {
                i = ch - '0' + i * 10;
        

        代码中的问题是每次读取一个新字符时都会覆盖 i。您需要存储您读取的数字,然后添加到它。

        【讨论】:

          【解决方案5】:

          你应该注意不是数字字符:

          while((ch=getchar()) != '\n')
             if(ch >= '0' && ch <= '9')
                 i += 10* i + (ch - '0');
          

          对于开头的“-”或“+”,您可以存储第一个 getchar()。一个解决方案可能是:

          #include <stdlib.h>
          #include <stdio.h>
          
          int main(void) {
             int i = 0;
             char ch,first_ch;
          
             printf("voer een getal in: ");
          
             ch = first_ch = getchar();
             while (ch != '\n') {
                if(ch >= '0' && ch <= '9')
                   i = 10* i + (ch - '0');
                ch = getchar();
             }
             if(first_ch == '-')
                i *= -1;
          
             printf("het ingevoerde getal is: %d\n", i);
             return EXIT_SUCCESS;
          }
          

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 1970-01-01
            • 1970-01-01
            • 2022-08-04
            • 2012-02-04
            • 1970-01-01
            • 1970-01-01
            • 2014-06-11
            • 1970-01-01
            相关资源
            最近更新 更多