2012-05-10 5 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 затем подбирает его.

Edit: Как Джонатон указывает, cin >> ws не работает прямо в этом случае (я уверен, что я использовал это, как это раньше, хотя я не могу найти пример).

Протестировано Вместо этого, добавив это после серийного номера, вы получите возврат каретки (и любые другие пробелы) из потока, чтобы он был готов для следующего имени DVD.

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

Это не пробел, который заставляет его возвращаться. – johnathon

+0

Это тоже белые. манипулятор 'ws' будет принимать любые белые, включая пробелы, вкладки, новые строки и возврат каретки. – crashmstr

+0

просто отметить, cin >> ws; несмотря на то, что его код продвигается дальше этой точки, работает cin.ignore (2, '\ n'). – johnathon

Смежные вопросы