2012-05-10 100 views
0

我希望用戶輸入一個字符串,雙倍和一個長,但事情是在第一次之後,該字符串被忽略,並留空,並提示爲雙直。取第一個字符串輸入,然後忽略其餘

這裏是我的代碼:

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    string name; 
    double price; 
    long serial; 

    cout << "Enter the dvd's name: "; getline(cin, name); 
    cout << "Enter the dvd's price (in $): "; cin >> price; 
    cout << "Enter the dvd's serial number: "; cin >> serial; 

    cout << endl; 

    cout << "Enter the dvd's name: "; getline(cin, name); 
    cout << "Enter the dvd's price (in $): "; cin >> price; 
    cout << "Enter the dvd's serial number: "; cin >> serial; 

    return 0; 
} 

the console of the code

,你可以在第一時間看到,我可以輸入一個字符串第二次只是將我直接把雙,即使我忽略了缺少字符串,並放置一個雙精度型和長精度型,它將打印空字符串的名稱。

我的代碼有什麼問題?

+1

你可以試試['沖洗cin'(http://stackoverflow.com/questions/257091/how-do-i- flush-the-cin-buffer)在再次調用getline之前 –

+0

這是一個常見問題。我確信它已經在這裏被問過很多次了。 – chris

回答

1

我一般在這種情況下使用istringstream(如下圖所示)。但是,一個更好的解決辦法是使用cin.ignore

#include <sstream> 

int main() { 
    string name,line; 
    double price; 
    long serial; 

    cout << "Enter the dvd's name: "; getline(cin, line); 
    name = line; 
    cout << "Enter the dvd's price (in $): "; 
    getline(cin,line); 
    istringstream(line)>>price; 
    cout << "Enter the dvd's serial number: "; 
    getline(cin,line); 
    istringstream(line)>>serial; 
    cout << endl; 
    return 0; 

}

1

之後的空格(回車或空格)沒有檢索到序列號,然後getline接起來。

編輯:正如johnathon指出的,cin >> ws在這種情況下無法正常工作(我確信我以前使用過這種方式,雖然我找不到示例)。

經測試的解決方案:相反,在序列號後面添加此值將使回車(以及其他任何空白)退出流,以便爲下一個DVD名稱做好準備。

string dummy; 
getline(cin, dummy); 
+1

這不是讓他的空白,它是馴鹿返回 – johnathon

+0

這些也是whitepspace。 'ws'操縱器將採用任何whitepsace,其中包括空格,製表符,換行符和回車符。 – crashmstr

+0

只是要注意,cin >> ws;防止他的代碼超越這一點,cin.ignore(2,'\ n')雖然工作。 – johnathon

相關問題