2013-08-29 12 views
0

我看了一些別人的質疑,我在C++知道,如果應用到這裏,我的問題,他們也newbish ..函數getline()將無法讀取字符串的第一個字時,我把它給一個變量

基本上,當顯示「名稱」的輸出時,如果輸入我的全名,它只會顯示第二個單詞。之前,它甚至沒有采取任何措施,只是略過了它。我現在很困惑,看起來很簡單。謝謝。

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
double money; 
string name; 
int age; 

// Prompt for age and receive 
cout<<"How old are you? "; 
cin >> age; 

// Prompt for money and receive 
cout<<"How much money do you have?"; 
cin >> money >> endl; 

// Prompt for name and receive 
cout<<"What's your name?\n\n"<< endl; 
getline(cin, name); 

// Display all information to user 
cout<<"Hello, "<< name <<"."; 
cout << "You are " << age << " years old"; 
cout<< " and have $" << money << ".\n"; 

system("PAUSE"); 
return 0; 
} 
+2

請勿混用'getline'和''>>除非你真的* *瞭解如何處理換行符。就你而言,只需要使用'getline'。 –

+0

'cin >> money >> endl;'這是否編譯?我在這裏嘗試並得到了大量的錯誤... – zentrunix

回答

0

這是因爲從newline該「多少錢,你呢?」答覆仍然在輸入緩衝區中。一般來說它不混個好主意項目輸入和線路輸入的基礎(無論是使用C和scanf/fgets或C++ >>getline),因爲如果你把這些樣的問題。

您可以通過之前在什麼地方getline使用char dummy = cin.get();解決這個特定的情況,但是,你必須做的,每次你從「項目輸入」到「線路輸入」切換,並且時間,如果你以後更改順序,你有記得一起移動cin.get()

更好的解決方案是始終使用基於行的輸入,然後用stringstream獲取數據出字符串的,所以這樣的事情:

string ageString; 
getline(cin, ageString); 
stringstream ageSs(ageString); 
if (!ageSs >> age) 
{ 
    cout << "Bad input" << endl; 
    exit(1); // You may of course want to repeat rather than exit... 
} 

這樣,你正在閱讀一整行,不管輸入是什麼。

3

的問題是,使用>>格式化輸入讀取值,則暫時停止的值被完全解析。例如,一旦出現與格式不匹配的內容,就會完成一個數字。也就是說,閱讀會停在空格或換行符(還有其他幾個字符)前面。通常情況下,因爲格式的輸入與試圖讀取實際值之前跳過前導空格(空格,製表符,換行符等)開始關閉這些額外的字符不會導致問題。

但是,未格式化的輸入(例如getline())立即開始讀取其值並在遇到換行符後停止(或者如果使用三個參數版本,則指定爲換行符指定的字符)。也就是說,getline()會立即如果在流中左讀換行符後停止。

最簡單的方法來擺脫換行符(以及任何其他前導空格)是使用std::ws,如:

if (std::getline(std::cin >> std::ws, name)) { 
    ... 
} 

...而且,順便說一句,當你嘗試讀取你應該後總是檢查讀取讀取值的嘗試是成功的!

另一種方法是根本不使用std::getline(),而只是使用name的格式化輸入。但是,這假定名稱中沒有任何空間。

+0

+1預先空白空間的整潔技巧。 –

相關問題