2013-03-23 62 views
1

例如,如果我想编写一个代码来平均用户输入的未指定数量的数字,我怎样才能让用户确定数字的数量?即。如果用户想要平均三个数字,他一次只输入一个数字,然后键入某个东西来表示这是事实。如何允许用户从终端循环时退出?

我写的东西像

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

“然后一些代码在阵列中平均的数字。”

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

+0

好的,所以我意识到在终端输入-1会做我想做的事情,但我想通过输入不是数字的东西来实现。我怎样才能做到这一点? – JLA 2013-03-23 20:00:06

+1

比你应该读入一个字符数组(字符串)的输入并解析结果。如果它的一个数字继续,如果它没有测试终止文本 – giorashc 2013-03-23 20:01:53

+0

按'ctrl + D'?顺便说一句,你必须检查'scanf'的返回值!并阅读'man scanf'。 – 2013-03-23 20:03:15

回答

0

你不能写“EOF” ..因为你正在读成若干... EOF等于-1 ..所以,如果他照耀处在于,循环将停止

+0

谢谢,刚刚意识到你的评论后。我怎样才能做到我所描述的不使用整数? – JLA 2013-03-23 20:00:55

+0

读入一个char数组,然后检查它是否不是EOF,使用atoi将它转换为(我假设你想要的)number – Alon 2013-03-23 20:01:30

1

I want to do it by typing in something that's not a number

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

char buf[0x80]; 
do { 
    fgets(buf, sizeof(buf), stdin); 
    if (isdigit(buf[0])) { 
     array[x++] = strtod(buf); 
    } 
} while(isdigit(buf[0]); 
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); 
} 
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++; 
    } 
} 
3

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

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

您应该存储返回值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是否不溢出数组的边界。我将此作为练习。

+0

scanf(“^ * [^ \ n]”)有点革命性的语义C语言:-)。但很好的解释所以+1。 – 2013-03-23 20:16:41