2011-07-10 120 views
5

這可能是一個非常簡單的問題,但請原諒我,因爲我是新手。 這裏是我的代碼:getline不要求輸入?

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

int main() 
{ 
    string name; 
    int i; 
    string mystr; 
    float price = 0; 

    cout << "Hello World!" << endl; 
    cout << "What is your name? "; 
    cin >> name; 
    cout << "Hello " << name << endl; 
    cout << "How old are you? "; 
    cin >> i; 
    cout << "Wow " << i << endl; 

    cout << "How much is that jacket? "; 
    getline (cin,mystr); 
    stringstream(mystr) >> price; 
    cout << price << endl; 
    system("pause"); 

    return 0; 
} 

的問題是,當被問及how much is that jacket?函數getline不要求輸入用戶和剛剛輸入的「0」的初始值。爲什麼是這樣?

+1

注:這已經問了很多次。這裏有一些少數http://stackoverflow.com/questions/3731529/program-is-skipping-over-getline-without-taking-user-input http://stackoverflow.com/questions/1744665/need-help-與-函數getline http://stackoverflow.com/questions/4876959/ignore-spaces-using-getline-in-c – cpx

回答

12

您有getline混合operator>>時要小心。問題是,當你使用operator>>時,用戶輸入他們的數據,然後按下回車鍵,它將一個換行符放入輸入緩衝區。由於operator>>是空格分隔的,因此換行符不會放入變量中,並且它保留在輸入緩衝區中。然後,當你撥打getline時,換行符是它唯一需要查找的內容。由於這是緩衝區中的第一件事,因此它會立即找到它正在查找的內容,並且從不需要提示用戶。

修復: 如果你要打電話getline您使用operator>>後,調用之間忽略,或做別的事情來擺脫換行符,也許是一個虛擬呼叫getline的。

另一種選擇是,根據Martin所說的,根本不使用operator>>,只使用getline,然後將字符串轉換爲您需要的任何數據類型。這有一個副作用,使您的代碼更加安全可靠。我會先寫一個函數是這樣的:

int getInt(std::istream & is) 
{ 
    std::string input; 
    std::getline(is,input); 

    // C++11 version 
    return stoi(input); // throws on failure 

    // C++98 version 
    /* 
    std::istringstream iss(input); 
    int i; 
    if (!(iss >> i)) { 
     // handle error somehow 
    } 
    return i; 
    */ 
} 

您可以創建花車,雙打和其他的東西了類似的功能。然後,當你需要在INT,而不是這樣的:

cin >> i; 

你這樣做:

i = getInt(cin); 
+0

非常感謝Benjamin!我完全理解你 – UzumakiDev

+0

爲什麼我不能更快加入本站: -/ – UzumakiDev

+0

「返回stoi(輸入)」基本上是指如果返回類型是字符串轉換爲整數? – UzumakiDev

2

它,因爲你有一個'\n'遺落的輸入流從以前的電話。

cin >> i; // This reads the number but the '\n' you hit after the number 
      // is still on the input. 

做交互式用戶輸入的最簡單方法是確保每一行都是獨立處理(如用戶將打擊後各提示符下輸入)。

結果總是讀一條線,然後再處理線(直到你熟悉的流)。

std::string line; 
std::getline(std::cin, line); 

std::stringstream linestream(line); 

// Now processes linestream. 
std::string garbage; 
lienstream >> i >> garbage; // You may want to check for garbage after the number. 

if (!garbage.empty()) 
{ 
    std::cout << "Error\n"; 
} 
+0

我不明白?那麼,你建議我怎樣才能讓getline獲得輸入?對不起,我一個完整的n00b – UzumakiDev

+0

謝謝兩位,我要在心中,只要我知道我在做什麼多一點..歡呼 – UzumakiDev

+0

我發現這非常有用[鏈接]保持這種http://augustcouncil.com/ 〜tgibson/tutorial/iotips.html [鏈接] – UzumakiDev

2

忽略某些字符,直到達到換行。

cin.ignore(256, '\n') 
getline (cin,mystr); 
+0

你能解釋一下嗎?爲什麼我忽略256個字符並不比一個字節多256個? – UzumakiDev

+0

這是從輸入流中提取或忽略的_maximum_字符數。根據輸入的長度,您可以有一個大於256的數字。在你的情況下,我假設256是'name'字符串的輸入字符的最大長度。 – cpx