2013-10-21 76 views
-3

在C++和java中輸入問題,如果我們在整數後輸入一個字符串,它將跳過它轉到下一個語句。字符串輸入 - 被忽略的第一行

string name; 
int age; 
cout<<"Enter age"; 
cin>>age; 
cout<<"Enter name"; 
getline(cin,name); 



cout<<name; 
cout<<age; 

getch(); 

上面的代碼不採取將其命名爲跳過此line.what aproblem與它...... ???

+8

我沒有在這裏看到java代碼 – P0W

+0

我希望你不只是標記java,因爲它是一個受歡迎的標籤... – Cruncher

+0

當你有基於行的輸入時,第一個數字後面還有字符或換行符,沒有閱讀,只是因爲你要求更多的數據而沒有消失。 –

回答

2

當讀取整數值時,引入以完成該行的[Enter]仍在流中,並且getline(cin,name)讀取[Enter]。

爲了解決該問題,第一flush cin before getting the string

string name; 
int age; 
cout<<"Enter age"; 
cin>>age; 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignores all enters 
cout<<"Enter name"; 
getline(cin,name); 

cout<<name; 
cout<<age; 

getch(); 
+0

感謝xorguy爲您的幫助... –

2

我將回答爲僅限於C++,因爲只有C++代碼是否存在。

std::getline將消耗前一個operator >>留下的輸入流中的換行符,並因此返回。

一個簡單的解決辦法是使用std::getline

#include<limits> 
// .... 
string name; 
int age; 
cout<<"Enter age"; 
cin>>age; 

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

cout<<"Enter name"; 
getline(cin,name); 
+0

感謝您的幫助pow ... –

0
std::cin >> age; 
std::getline(std::cin, name); 

比方說,用戶輸入整數5.這是之前 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

忽略輸入的行中的所有剩餘字符輸入流將如下所示:

5\n 
... 

請注意,上述內容可能會有所不同。用戶可以輸入一個整數,然後輸入一個空格字符。兩者都是同樣有效的情況。

也就是說,用戶輸入值並點擊返回提交。 operator >>被格式化,以便整數將被消耗,但是一旦它發現一個新行或空白提取將停止。輸入操作後,新行應仍在流中。

\n 
... 

現在,讓我們來看看name內容:

\n 
"Bruce Wayne"\n 

getline執行,一旦發現流中的一個新的生產線將停止尋找新的輸入。之前提取的新行仍在流中,因此輸入立即停止。沒有提取!

幸運的是,我們可以使用ignore方法從流丟棄新行:

std::cin >> age; 
std::cin.ignore(); // ignore the next character 

std::getline(std::cin, age); 

默認情況下,std::cin.ignore給出0參數時會從流丟棄下一個字符。

這是live example

+0

感謝您的幫助... –