2013-08-21 131 views
2

我在C++中創建了一個簡單的控制檯應用程序,該應用程序從用戶處獲取字符串和字符輸入。爲了簡單起見,我想使用字符串char數據類型將輸入從cin傳遞給。C++ iostream:使用cin >> var和getline(cin,var)輸入錯誤

要獲得字符串輸入,我使用的是函數getline方法:

string var; 
cin.ignore(); //I used ignore() because it prevents skipping a line after using cin >> var 
getline(cin, var); 

要獲得字符輸入,我使用的是CIN >> VAR方法:

char var; 
cin >> var; 

這在大部分情況下工作正常。但是,當我使用getline輸入字符串時,它會忽略我的字符串的第一個字符。

是否有可能使用函數getlineCIN >>,而不必使用忽略的方法,或者我可以打電話,以確保我的第一個字符是不是跳過?

這是一個代碼全樣本,我同時使用函數getlineCIN >>

string firstName; 
string lastName; 
char gender = 'A'; 

cout << "First Name: "; 
cin.ignore(); 
getline(cin, firstName); 


cout << "Last Name: "; 
cin.ignore(); 
getline(cin, lastName); 

while(genderChar != 'M' && genderChar != 'F') 
{ 
    cout << "Gender (M/F): "; 
    cin >> genderChar; 
    genderChar = toupper(genderChar); 
} 
+0

我不明白你對cin.ignore()的評論。根據它的api定義,它將放棄你輸入的字符串的第一個字符,就像你現在遇到的場景一樣。 –

+0

@JinChen抱歉,修正。我的意思是說,如果我不使用ignore(),它會跳過一行輸入。 – miguelarcilla

+0

仍然很奇怪,cin.ignore()不應該像那樣行爲。你能提供更多的問題代碼嗎? –

回答

4

cin>>var;

只抓住從緩衝區中var,它的葉子在緩衝區中的\n, ,然後立即被getline

於是抓起,以下是蠻好的,(如果我的理解正確你的問題)

cin>>var; 
cin.ignore();  //Skip trailing '\n' 
getline(cin, var); 

根據你編輯

您不必使用cin.ignore();geline

這種提取從緩衝區,並將它們存儲字符轉換成firstName或(lastName),直到這裏的劃定字符-newline('\n')。

1

std::cin.ignore()會忽略你輸入的第一個字符。

對於你的情況,使用std::cin.ignore()std::cin然後getline()忽略換行符爲:

cin>>ch; 
cin.ignore(); //to skip the newline character in the buffer 
getline(cin,var); 
1

ignore()不跳行,它會跳過一個字符。您能否發送示例代碼並詳細說明cin.ignore()的需求?

+0

我更新了一些示例代碼的問題:)但我認爲我的問題變得有點不清楚在這個過程中。 – miguelarcilla