2017-02-11 200 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; 
}