2015-11-02 151 views
-1

我的代碼沒有問題。我嘗試使'while'循環讀取我所有的輸入值,然後停止當我點擊EOF。我已經讀過Windows中的EOF是CTRL + Z等,但我的'while'不想停止,並且在所有輸入值和CTRL + Z之後,它保持並等待下一個值。 這是我的代碼,希望您能幫幫我謝謝):如何在EOF後停止讀取值

#include <stdio.h> 
#include <stdbool.h> 

#define gc getchar 



inline int scan_integer(); 
inline void zaprzeczenie(bool*); 


int main() { 
    bool rosnie=true; 

    int poprzednia; 
    register int terazniejsza; 


    terazniejsza = scan_integer(); 
    poprzednia = terazniejsza; 

    int sumaAktualnego=terazniejsza; 
    int sumaNajwiekszego=terazniejsza; 

    int iloscAktualnego=1; 
    int iloscNajwiekszego=0; 

    int staly=1; 
    int sumaStalego=0; 


    while(!feof(stdin)) 
    { 
    printf("%d ",terazniejsza); 
    terazniejsza = scan_integer(); 


    if(terazniejsza<poprzednia){ 
     if(rosnie){ 
      if(iloscAktualnego>iloscNajwiekszego){ 
       iloscNajwiekszego=iloscAktualnego; 
       sumaNajwiekszego=sumaAktualnego; 
      } 
      iloscAktualnego=1; 
      sumaAktualnego=terazniejsza; 

      if(staly>1){ 
       iloscAktualnego+=staly; 
       sumaAktualnego+=sumaStalego; 
       staly=1; 
       sumaStalego=0; 
      } 

      zaprzeczenie(&rosnie); 
     } 
     else{ 
      sumaAktualnego+=terazniejsza; 
      iloscAktualnego++; 
     } 
    } 
    else if(terazniejsza>poprzednia){ 
     if(rosnie){ 
      sumaAktualnego+=terazniejsza; 
      iloscAktualnego++; 
     } 
     else{ 
      if(iloscAktualnego>iloscNajwiekszego){ 
       iloscNajwiekszego=iloscAktualnego; 
       sumaNajwiekszego=sumaAktualnego; 
      } 
      iloscAktualnego=1; 
      sumaAktualnego=terazniejsza; 

      if(staly>0){ 
       iloscAktualnego+=staly; 
       sumaAktualnego+=sumaStalego; 
       staly=1; 
       sumaStalego=0; 
      } 

      zaprzeczenie(&rosnie); 
     } 
    } 
    else if(terazniejsza==poprzednia){ 
     staly++; 
     sumaStalego+=poprzednia; 
     sumaStalego+=terazniejsza; 
     sumaAktualnego+=terazniejsza; 
     iloscAktualnego++; 
    } 

    poprzednia=terazniejsza; 
} 
    if(iloscAktualnego>iloscNajwiekszego){ 
     iloscNajwiekszego=iloscAktualnego; 
     sumaNajwiekszego=sumaAktualnego; 
    } 

    printf("%d %d",iloscNajwiekszego, sumaNajwiekszego); 
} 

inline int scan_integer() 
{ 
    register int c = gc(); 
    int wejsciowa = 0; 
    for(; ((c<48 || c>57)); c = gc()); 

    for(;c>47 && c<58; c = gc()) { 
     wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48; 
    } 
    return wejsciowa; 
} 

inline void zaprzeczenie(bool* boo){ 
    boo=!boo; 
} 

PS:對不起,拋光變量)

+0

請正確格式化您的代碼。 –

+2

[爲什麼「while(!feof(file))」總是出錯?](http://stackoverflow.com/q/5431941/1679849) –

+0

需要測試'gc()'返回'EOF'的時候。 – chux

回答

1
#define gc getchar 

請不要這樣做 - 這使得它很難給別人看的並理解你的代碼。

while(!feof(stream))不符合大多數人的期望,並且會循環太多次。相反,您需要檢查上次輸入操作的結果。由於您使用的是getchar,因此您可以查看結果如下:

while ((terazniejsza = scan_integer()) != EOF) 
{ 
    ... 
} 

... 

inline int scan_integer() 
{ 
    register int c = gc(); 
    int wejsciowa = 0; 
    for(; ((c<48 || c>57) && c != EOF); c = gc()); 

    for(;c>47 && c<58 && c != EOF; c = gc()) { 
     wejsciowa = (wejsciowa << 1) + (wejsciowa << 3) + c - 48; 
    } 
    return c != EOF ? wejsciowa : c; 
}  
+0

謝謝,但它仍然無法正常工作......'雖然'不想停止等待,似乎scan_ineger不想返回EOF或它不返回EOF ... –