1

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

我写了类似的东西

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

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

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

4

5 回答 5

3

scanf以两种不同的方式返回信息:在变量i中,以及作为其返回值。变量的内容i是读取的数字scanf,如果它能够返回一个数字。from 的返回值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是否不会溢出数组的边界。我把这个作为练习。

于 2013-03-23T20:10:00.350 回答
1

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

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

char buf[0x80];
do {
    fgets(buf, sizeof(buf), stdin);
    if (isdigit(buf[0])) {
        array[x++] = strtod(buf);
    }
} while(isdigit(buf[0]);
于 2013-03-23T20:02:49.387 回答
1

如果没有输入,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++;
    }
}
于 2013-03-23T20:09:53.873 回答
0

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

于 2013-03-23T19:58:48.777 回答
0

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

printf("type in a number:" \n);    
while(scanf("%f",&i)!=EOF){
    array[x]=i;
    x++;
    printf("type in a number:" \n);  
}
于 2013-03-23T20:07:10.643 回答