2013-01-09 29 views
3

確定我已經在這幾個小時....爲什麼我的C++程序打印一個額外的換行符?

//after a character is entered, library routines are used to uppercase the 
letters. loops the program until "1" is entered 

char letter; 

while (letter != '1') 
{ 
    cout << "Enter a letter: "; 
    cin.get(letter); 
    cout << char(toupper(letter)) << '\n'; 
} 

一切的作品,但它COUTS「輸入一個字母:」兩次......

這裏是一個示例輸出

Enter a letter: h 
H 
Enter a letter: 

Enter a letter: k 
K 
Enter a letter: 

Enter a letter: a 
A 

我希望它看起來像這樣

Enter a letter: h 
H 
Enter a letter: k 
K 
Enter a letter: a 
A 

你能幫助解釋爲什麼它是這樣做的......

+1

首先嚐試使用<< endl代替<<'\ n',這將消除任何緩衝問題 –

+0

也爲什麼cin.get而不是cin >>? –

+0

第一個字母是你打字,第二個是打印出你的程序。不是嗎?如果你想讓輸入「不可見」,你可能需要使用像[ncurses]這樣的包(http://cboard.cprogramming.com/linux-programming/80662-ncurses-cplusplus-tutorial-documentation.html)。 – paulsm4

回答

8

當你輸入你的數據,你輸入的字母,然後按ENTER。這會將您的字母以及返回字符(\n)添加到流中。由於cin.get()在仍有字符從流中提取時不會等待輸入,因此每隔一個通道就會提取\n

,可以快速添加cin.ignore解決這個問題:

while (letter != '1') 
{ 
    cout << "Enter a letter: "; 
    cin.get(letter); 
    cin.ignore(256, '\n'); 
    cout << char(toupper(letter)) << '\n'; 
} 

的備選是使用>>運營商如cin.get一次只取出一個字符:

while (letter != '1') 
{ 
    cout << "Enter a letter: "; 
    cin >> letter; 
    cout << char(toupper(letter)) << '\n'; 
} 
+1

哈哈11秒太好了+1,但你應該建議cin >> –

+1

那麼,使用提取操作符'cin >>'具有相同的效果。 –

+0

好點。補充說。 – Foggzie

3

只要改變cin.get(letter)cin >> letter;,它會按預期工作。

編輯:想到我給了更多的信息。 get()從流中精確提取一個字符,這會使其他人指出的換行符留在那裏。下一次調用get()會將其提取並立即終止,而不是等待輸入,因爲該流仍有數據。另一方面,>>-操作符正是爲了你在這裏要做的事情而做的:從stdin中讀取一個值,直到按下返回鍵。因此,它也消耗換行符,導致下一個呼叫operator<<()阻塞,直到用戶輸入新數據。

注:還有一兩件事要記住:>>出入用成炭將提取在從流最多一個字符,但它不會阻止用戶,按Enter進入多個字符。這會產生一些輸出類似如下:

[email protected]:~$ ./a.out 
Enter a letter: a 
A 
Enter a letter: asas 
A 
Enter a letter: S 
Enter a letter: A 
Enter a letter: S 

這是因爲操作者除去一個字符和換行,但保留剩餘字符的流。這些將立即終止接下來的三個operator>>()-呼叫。

+0

這很好,很棒的附加信息 –

+0

無論你使用'cin.get(letter)'還是'cin >> letter'都與這個問題無關。問題是1)他在不測試輸入是否成功的情況下使用結果,以及2)他沒有采取任何措施關閉OS的常見行處理。 –

1

對於初學者,因爲您不檢查cin.get是否成功 或不。您幾乎可以肯定會輸出最後一個字符 閱讀兩次。你的循環應該是:

while (letter != '1' && cin.get(letter)) ... 

while (cin.get(letter) && letter != '1') ... 

還要注意,在大多數系統中,cin.get()不會返回,直到 你按下回車鍵(從鍵盤輸入的假設)。所以你會 輸出"Enter a letter: ",然後等到輸入鍵 被按下。然後,您將循環而不等待,讀取您輸入的所有字符,直到您閱讀'\n'。在C++標準 中沒有關於字符方式輸入的規定,並且用於執行方法的技術從一個系統 到另一個系統根本不同。

相關問題