【问题标题】:How to allow user to exit while loop from terminal?如何允许用户从终端退出while循环?
【发布时间】:2013-03-23 19:50:16
【问题描述】:

例如,如果我想编写一个代码来平均用户输入的未指定数量的数字,我怎样才能使用户可以确定数字的数量? IE。如果用户只想平均三个数字,他一次输入一个,然后输入一些东西来表示就是这样。

我写了类似的东西

while(i!=EOF){
    printf("type in a number: \n");
    scanf("%f",&i);
    array[x]=i;
    x++;
}

“然后是一些代码来平均数组中的数字”。

这个想法是,如果用户想要表示他已完成输入数字,则他输入 EOF,然后 while 循环将停止,但这不起作用。当我在终端输入 EOF 时,它只是无限期地写“输入数字:”。

【问题讨论】:

  • 好的,所以我意识到在终端输入 -1 可以完成我想做的事情,但我想通过输入不是数字的东西来做到这一点。我该怎么做?
  • 您应该将输入读入一个字符数组(字符串)并解析结果。如果它的数字继续,如果它不测试终止文本
  • ctrl+D?顺便说一句,您必须检查scanf 的返回值!并阅读man scanf

标签: c input scanf libc


【解决方案1】:

scanf 以两种不同的方式返回信息:在变量i 中,以及作为其返回值。变量i 的内容是scanf 读取的数字,如果它能够返回一个数字。 scanf 的返回值表示它是否能够读取数字。

您的测试i != EOF 基本上是一个类型错误:您将错误指示值EOF 与设计用于保存浮点数的变量进行比较。编译器不会抱怨,因为这是意外有效的 C 代码:EOF 被编码为整数值,并且该值被转换为浮点值以执行比较。事实上,您会注意到,如果您在提示符处输入-1,循环将终止。 -1EOF 常量的值(在大多数实现中)。

您应该存储scanf 的返回值,并将其存储到一个单独的变量中。如果返回值为EOF,则终止循环。如果返回值为 1,则表示成功读取了一个浮点值。

如果返回值为 0,则用户键入了无法解析的内容。您需要适当地处理这种情况:如果您什么都不做,用户的输入不会被丢弃,您的程序将永远循环。两个有意义的选择是丢弃一个字符或整行(我会做后者)。

double i;
double array[42];
int x = 0;
int r = 0;
while (r != EOF) {
    printf("type in a number: \n");
    r = scanf("%f", &i);
    if (r == 1) {
        /* Read a number successfully */
        array[x] = i;
        x++;
    } else if (r == 0) {
       printf("Invalid number, try again.\n");
       scanf("%*[^\n]"); /* Discard all characters until the next newline */
    }
}

您还应该检查x 不会溢出数组的边界。我将把它留作练习。

【讨论】:

  • scanf("^*[^\n]") 对于 C 语言来说有点革命性的语义:-)。但是很好的解释,所以+1。
【解决方案2】:

我想通过输入不是数字的东西来做到这一点

然后将输入作为字符串获取,如果不能转换为数字则退出。

char buf[0x80];
do {
    fgets(buf, sizeof(buf), stdin);
    if (isdigit(buf[0])) {
        array[x++] = strtod(buf);
    }
} while(isdigit(buf[0]);

【讨论】:

    【解决方案3】:

    如果没有输入,scanf() 不会将 i 设置为 EOF,而是可以返回 EOF。所以你应该分析 scanf() 返回码。顺便说一句,您可以收到 0 作为结果,这实际上意味着没有 EOF 但无法读取数字。

    这是给你的例子:

    #include <stdio.h>
    #define MAX_SIZE 5
    
    int main()
    {
        int array[MAX_SIZE];
        int x = 0;
        int r = 0;
        while (x < MAX_SIZE)
        {
            int i = 0;
            printf("type in a number: \n");
            r = scanf("%d",&i);
            if (r == 0)
            {
                printf("ERROR!\n");
                break;
            }
            if (r == EOF)
            {
                printf("EOF!\n");
                break;
            }
            array[x]=i;
            x++;
        }
    }
    

    【讨论】:

      【解决方案4】:

      你不能写'EOF'..因为你正在读一个数字...... EOF 等于 -1.. 因此,如果他输入,循环将停止

      【讨论】:

      • 谢谢,在您发表评论后才意识到。如果不使用整数,我该如何做我所描述的?
      • 读入一个 char 数组,然后检查它是否不是 EOF,在其上使用 atoi 将其转换为(我假设你想要的)数字
      【解决方案5】:

      您可以测试scanf 函数的返回值。它在匹配失败或遇到 EOF 字符时返回 EOF。

      printf("type in a number:" \n);    
      while(scanf("%f",&i)!=EOF){
          array[x]=i;
          x++;
          printf("type in a number:" \n);  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-08
        • 1970-01-01
        • 2023-04-08
        • 2011-11-07
        • 2020-05-25
        • 1970-01-01
        • 2019-08-03
        • 2015-01-18
        相关资源
        最近更新 更多