2015-11-02 113 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 ... –