2013-03-13 51 views
0

我在C++程序不會停止if(scanf()==EOF)break;,下面是我的程序的素描,例如輸入:如果(scanf()== EOF)break,C++中的程序不會停止;

X XjhgXjhX 

給輸出:

jhgjh 

那就是 - 它打印除了X所有字符,但它不會停止在Ctrl+Z

using namespace std; 

int main() 
{ 
    char str[100]={0},znak,forbd; 
    int i=0,j=0; 
    while(true) 
    { 
     i=0; 
     j=0; 

     if(scanf("%c",&forbd)==EOF) 
      break; 

     if(scanf("%c",&znak)==EOF) 
      break; 

     while(znak!='\n') 
     { 
      if(forbd!=znak && znak!=' ') 
      { 
       str[i]=znak; 
       i++; 
       //cout<<i<<"\n"; 
      } 

      if(scanf("%c",&znak)==EOF) 
       break; 
     } 

     while(j<i) 
     { 
      printf("%c",str[j]); 
      j++; 
     } 
     printf("%c",'\n'); 
    } 
    return 0; 
} 

我不想與閱讀\n使用cin,因爲麻煩。

+5

我想你應該問一下用'cin'來解決你的問題。 – moooeeeep 2013-03-13 18:31:01

+0

@moooeeeep但是'cin'和'\ n'問題呢?我更喜歡'scanf',因爲它真的更快。 – Qbik 2013-03-13 18:32:24

+0

@Qbik:cin和'\ n'有什麼問題?對於上面的代碼,我懷疑你會看到任何性能差異。 C++流速較慢有兩個原因1)它們綁定到stdin/stdout(取消綁定它們變得更快)2)對流進行格式化讀取與本地人做了很多工作(所以你付出了工作)。如果你不關心這個,那就不要使用格式化的讀取。他們仍然稍微慢一點,但不是我認爲足夠擔心的事情。 – 2013-03-13 18:38:59

回答

0

好的,我打算使用iostream而不是cstdio代碼if(cin.peek()=='\n')break;檢測行結束,這解決了問題。

0

的scanf從stdin reference巫讀取:

stdin中已知的是不是指交互設備,該流被完全緩衝。否則,它是依賴於庫的,無論流是線路緩衝還是默認情況下都不緩衝(請參閱setvbuf)。

通常,stdin是行緩衝的,您需要輸入'\ n'來讀取。

從相關聯的question中,您可以找到此類字符閱讀用例的解決方案。