2013-06-12 96 views
4

在下面的代碼中,當我運行它時,如果我在運行時輸入了超過30個字符,它根本不會讀取linesNum1text[]如何處理從cin讀取的多餘字符?

所以我認爲它存儲了array1[30]的額外字符,並在linesNum1中使用它。

所以,我怎麼能清除程序的緩存,或使其cinlinesNum1text[]即使我進入字符多於array1可以持有?

char array1[30]; 
for (int i = 0; i<30; i++) 
    cin >> array1[i]; 
int linesNum1; 
cin >> linesNum1; 
int linesNum2 = linesNum1*80; 

char text[linesNum2]; 
for (int i = 0; i < linesNum2; i++) 
    cin >> text[i]; 

for (int i = 0; i < linesNum2; i++) 
    cout << text[i]; 
+0

你問了一個非常好的問題,人們不太可能會讓你失望。 – IanPudney

+0

這個問題的答案有一些關於避免輸入緩衝區溢出的建議:http://stackoverflow.com/questions/4895216/testing-buffer-overrun-of-input –

回答

1

您將需要刷新stdin緩衝區,以擺脫可能的額外字符。

您可以使用istream::ignore放棄所有可用的字符流中:

//Will discard everything until it reaches EOF. 
cin.ignore(numeric_limits<streamsize>::max()); 

//Will discard everything until it reaches a new line. 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

例子:

/* read 30 chars */ 
for (int i = 0; i<30; i++) cin >> array1[i]; 
/* discard all extra chars on the line */ 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
/* clear the stream state flags */ 
cin.clear(); 
cin >> linesNum1; 
... 
+0

我使用 'using namespace std;'in the我的程序的標題,你能解釋這個答案嗎? –

2

我相信你要找的是std::cin.ignore(INT_MAX);

這將讀入並忽略一切,直到EOF。另外,在此之前,您最有可能也想要執行std::cin.clear();以重置流。

編輯: 隨着cin.ignore()是在添加可選的第二個參數:

std::cin.ignore(INT_MAX,'\n'); 

這將忽略,直到行結束。