2017-02-11 158 views
0
#include<stdio.h> 
#define LINESIZE 1024 

int n, sum =0; 
char line[LINESIZE]; 

int main() { 
    while(1) { 
     printf("enter an integer: "); 
     if(!fgets(line, LINESIZE, stdin)) { 
      clearerr(stdin); 
      break; 
     } 

     if (sscanf(line, "%d", &n) == 1) 
      sum += n; 
    } 
    printf("%d \n",sum); 
} 

当我在Cygwin中运行这个时,输出似乎是无限的,我不知道如何返回sum?我错过了什么吗?如何在C中退出while循环?

enter an integer: 1 
enter an integer: 2 
enter an integer: 3 
enter an integer: 4 
enter an integer: 5 
enter an integer: 6 
+4

CTRL-d表示 – LogicG8

+0

@ LogicG8 TY :))) – Rgoat

+0

文件结束,你的时候期待'fgets'返回0?它只会在遇到文件标记结束时返回空指针,即'CTRL-D' – bruceg

回答

0

除了问题中提到的意见,我想建议一个稍微不同的方法。您可以修改if语句,该语句计算sum,以便当来自用户的输入不是int eger时,您选择退出while循环。

if (sscanf(line, "%d", &n) == 1) { 
     sum += n; 
    } 
    else { 
     printf("Could not get integer\n"); 
     break; 
    } 

示例输出1:

enter an integer: 
3 
enter an integer: 
4 
enter an integer: 
2 
enter an integer: 
r 
Could not get integer 

9 

示例输出2:sscanf的成功提取5从5GF

enter an integer: 
3 
enter an integer: 
4 
enter an integer: 
5gf 
enter an integer: 
t 
Could not get integer 

12 

示例输出3:sscanf的无法从r5f提取5这是正确的

enter an integer: 
5 
enter an integer: 
3 
enter an integer: 
r5f 
Could not get integer 

8 
+0

如果downvoter留下了评论,将不胜感激。谢谢。 – Rishi

+0

我不是downvoter,但我想你已经downvoted,因为你的文章没有回答这个问题,它只增加了一些不相关的东西。 – linuxfan

+0

@linuxfan,我相信我已经提供了一个问题的答案,并没有添加任何与这个问题无关的东西。 – Rishi

3

您的while循环没有问题,程序将循环,直到达到文件末尾stdin。在终端上,您可以通过按下Ctrl-D在Unix下和Ctrl-Z在Windows上输入来发信号通知文件结束。

或者,你可以当你读到一些特定的输入,如一个空行,没有数字线,字quit行退出循环...

有关该计划的一些言论:

  • 没有理由让您的变量成为全局变量,也无法清除stdin上的错误条件。
  • 无限循环的惯用语是for (;;) { ... }
  • main()应该返回0

这里是你的程序的修改版本:

#include <stdio.h> 

#define LINESIZE 1024 

int main(void) { 
    char line[LINESIZE]; 
    int n, sum = 0; 

    for (;;) { 
     printf("enter an integer: "); 
     if (!fgets(line, sizeof line, stdin)) { 
      break; 
     } 
     if (*line == '\n') { 
      /* stop on empty line */ 
      break; 
     } 
     if (!strcmp(line, "quit\n")) { 
      /* stop if the user types quit */ 
      break; 
     } 
     if (sscanf(line, "%d", &n) == 1) { 
      sum += n; 
     } 
    } 
    printf("%d\n", sum); 
    return 0; 
}