扫描来自标准输入的所有整数。假设每个输入行都是整数,空行表示输入的结尾

时间:2019-03-13 08:26:39

标签: c

扫描标准输入中的所有整数。假设每个输入行都是整数,空行表示输入的结尾。

我需要从一行中扫描整数,如果输入的输入为空,则中断。 尝试了以下代码,但给出了奇怪的输出。

while (true)
        {
            char ch=getchar();
            printf("%c\n",ch);

            if(ch=='\n')
            {
                break;

            }
            //printf("%d\n",myInt);
            getchar();
        }

请帮助! 谢谢

4 个答案:

答案 0 :(得分:1)

我发现您的代码存在许多问题:

  1. 该代码无法读取整数。它读取字符并打印。但是,由于不使用第二个getchar的返回值,因此它仅打印第二个字符。

  2. 没有错误检查。

  3. getchar的返回类型为int-不是char

有很多方法可以做您想要的。看来您想要使用getchar的解决方案,因此可能是这样的方式:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    while (1)
    {
        int n = 0;
        int multiplier = 1;
        int ch=getchar();
        if(ch=='\n') break;  // Empty line - stop reading integers
        if(ch=='-')
        {
            // Handle negative values
            multiplier = -1;
            ch=getchar();
            if(ch=='\n') exit(1);  // Error - unexpected newline
        }
        do
        {
            if(ch==EOF) exit(1); // Input error
            if (ch < '0' || ch > '9') exit(1); // Error - input is not a digit

            // "Add" current digit to the integer
            n = n * 10;
            n = n + ch - '0';

            ch=getchar();
        } while (ch != '\n');
        n = multiplier * n;
        printf("%d\n", n);
    }
    printf ("done\n");

    return 0;
}

一些评论:

上面的代码不是“生产质量”,但我想保持示例简单。一些简短的描述如下。

  1. 仅在错误时调用exit(1)可能不是您在实际应用程序中想要的。至少您首先要打印一些错误消息,但是通常,在处理用户输入时,您会添加更好的错误处理。

  2. 整数值的计算不检查整数溢出。在真实的应用程序中,您想添加一些东西。

  3. 实际上并不需要行if(ch==EOF) exit(1);,因为下一个if语句将捕获这种情况并退出。但是,我添加了以显示输入错误和非数字输入之间的区别。

答案 1 :(得分:1)

根据您的假设,行是整数,因此我们可以使用以下代码。
atoi函数将string转换为int
fgets用于从用户

接收字符串输入
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
  char str[1024]={};
  while( fgets(str, 1024, stdin) && str[0] != 0 && str[0] != '\n' ){
      int n = atoi(str);
      printf("%d\n", n);
  }
  return 0;
}

答案 2 :(得分:-2)

最简单的方法是只读取整数,然后在没有更多的整数要读取时停止。 scanf工作正常:

int n;
while (scanf("%d", &n) == 1) {
    // do something with integer n
}
// last scanf call failed to find an integer, so that's probably the end of input

如果输入形式为“整数,空行,更多应忽略的整数”,则此方法将无效。在这种情况下,代码应该稍微复杂一些。

答案 3 :(得分:-3)

这是我认为您要寻找的。在原始代码段中,由于有两个getchar()函数,您将仅每隔两个整数打印一次,而不是删除将读取所有字符的整数。然后在打印语句之前包含if语句,意味着您在打印结果时不会打印换行符。

            while (1)
            {
                char ch=getchar();
                if(ch=='\n')
                    break;
                printf("%c\n",ch);
            }