2009-11-16 4 views
1

Почему, когда я вошел в цикл ниже, и я набираю что-то первую команду cmdstd: getline (std :: cin, cmdInput); не считывает введенный ввод. Например, если я ввел «b 8», он должен отображать «cmd is b 8», но он переходит к следующему read std :: getline (std :: cin, input); и отображает «это b» вместоC++ STD Ошибка Cin во время цикла

while (editingMode == TRUE) { 
    std::getline(std::cin, cmdInput); 
    istringstream cmdiss(cmdInput); 
    cout << "you entered: " << cmdInput <<endl; 
    if (cmdInput != "") {  
     copy(istream_iterator<string>(cmdiss), 
      istream_iterator<string>(), 
      back_inserter<vector<string> >(tokens)); 
     std::cout << "cmd is " <<tokens.at(0) << std::endl; 
    } 

    //************************* 
    std::getline(std::cin, input); 
    istringstream iss(input); 
    if(input != ""){ 
     copy(istream_iterator<string>(iss), 
      istream_iterator<string>(), 
      back_inserter<vector<string> >(tokens)); 
     std::cout << "it is " << tokens.at(0) <<std::endl; 
     createInstruction(tokens); 
    } 

ответ

0

Вы уверены, что редактированиеМода TRUE?

1

В коде нет ничего плохого. Он просто не делает то, что, по вашему мнению, должен :) Если вы хотите напечатать всю введенную строку, а не первое слово, не печатайте токены [0]; распечатать строку ввода.

Обе секции делают то же самое:

  1. читать строку в строку
  2. создать IStream от этой линии
  3. читать слова из этого IStream в массив строк под названием «токенов»
  4. напечатать первое слово

tokens.at (0) является первым словом, очевидно. проверьте tokens.size() или перетащите маркеры, если вы хотите найти аргументы типа «8».

3

Возможно, у вас есть символ новой строки, оставшийся во входном буфере, от более раннего ввода? Это обычная ошибка.

Допустим, что ваша программа сначала считывает целое с CIN >> х, а затем линии с GetLine (CIN, командная_строка). Пользователь вводит целое число, за которым следует клавиша ENTER. Код cin >> x будет читать целое число, но клавиша ENTER, интерпретированная как символ новой строки, будет оставлена ​​во входном буфере.

Когда ваша программа продолжит читать полную строку с getline (cin, cmdline), она будет читать очень короткую строку, состоящую только из этого символа оставленной новой строки. Это похоже на то, что программа «переходит к следующему чтению».

+0

Довольно вероятно, что это проблема. См. Http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer для получения информации об очистке ввода. Я предлагаю что-то вроде ответа Мартина Йорка, поскольку он остановится, когда достигнет первой новой строки. – qid

0

Проблема заключается в смешении >> экстракций с getline, оставляя в буфере новую строку (или другой вход). Слепо использование игнорирования скроет логические ошибки, такие как ввод "42 abc", а затем cin >> some_int; cin.ignore(...);. Что вам действительно нужно сделать, это «извлечь» пустую строку:

int main() { 
    using namespace std; 
    int n; 
    string s; 

    cout << "Enter a number: " 
    cin >> n >> blankline; // <--- 

    if (cin) { 
    cout << "Enter a line of text: "; 
    getline(cin, s); 
    } 

    if (!cin) { 
    clog << "Sorry, I can't do that.\n"; 
    return 1; 
    else { 
    cout << "Input successful, now processing values: " << n << s << '\n'; 
    } 
    return 0; 
} 

К счастью, это easy:

template<class C, class T> 
std::basic_istream<C,T>& 
blankline(std::basic_istream<C,T>& s, 
      typename std::basic_istream<C,T>::char_type delim) { 
    if (s) { 
    typename std::basic_istream<C,T>::char_type input; 
    if (!s.get(input) && s.eof()) { 
     s.clear(s.eofbit); 
    } 
    else if (input != delim) { 
     s.putback(input); 
     s.setstate(s.failbit); 
    } 
    } 
    return s; 
} 

template<class C, class T> 
std::basic_istream<C,T>& blankline(std::basic_istream<C,T>& s) { 
    blankline(s, s.widen('\n')); 
    return s; 
} 
Смежные вопросы