2014-10-03 6 views
0

На этом сайте есть несколько вопросов, ссылающихся на getline, очевидно, что в буфере есть оставшиеся символы новой строки, которые необходимо очистить, предположительно с cin.ignore(). Я пробовал так много вариаций этого и ничего не работает, все, что я пытаюсь сделать, это простой ввод в консоль, а cin >> string не является вариантом, потому что строка может иметь пробелы.getline (cin, string) не работает EVEN WITH cin.ignore()

Вот мой код.

void prompt(std::string * str) 
{ 
    cout << "> "; 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 
    cin.ignore(); 
    cin.ignore(); 

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

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 

    *str = tmp; 
} 

Как вы можете видеть, я пробовал всевозможные вещи. Он по-прежнему пропускает getline(cin,tmp) и, как представляется, устанавливает str в пустую строку. Пожалуйста помоги. Спасибо за ваше время.

+2

Пожалуйста, не помечать вопросы C++ с C тег –

+0

Попробуйте удалить все '' игнорирующие) команды (и использовать 'станд :: GetLine (станд :: CIN> > std :: ws, tmp); вместо этого. '>> std :: ws' пропускает все пробелы (включая конец строк). – Galik

+0

Я не вижу ошибок. Do 'if (! Cin) {cout <<« Что-то установило failbit ». << endl; } ' –

ответ

0

Передача переменных с помощью указателей обескуражена. Если вы хотите вернуть значение из ссылки на функции &, рекомендуется.

Я не знаю контекста, который вы вызываете prompt(), но вот предложение для реализации prompt(), которое может работать лучше для вас.

#include <algorithm> 
#include <iostream> 
#include <string> 

// return bool so you know if it failed or not 
bool prompt(std::string& s) // use reference 
{ 
    std::cout << "> "; 
    return std::getline(std::cin >> std::ws, s); 
} 

int main() 
{ 
    char c; 
    std::string s; 

    do 
    { 
     if(!prompt(s)) // always check the imput 
      break; 

     // process the string (reverse it for example...) 
     std::reverse(s.begin(), s.end()); 
     std::cout << "reversed: " << s << '\n'; 

     std::cout << "Another go? [y/n]: "; 
    } 
    while(std::cin.get(c) && std::tolower(c) == 'y'); 
} 
1

Как только отформатированное извлечение завершилось неудачно, в вашем потоке будет установлен сбой битбит, и будущие операции ничего не сделают. Это несколько удобно, потому что вы можете обрабатывать ошибки в группах вместо проверки после каждой отдельной операции. Но как только вы обнаружите ошибку, вам нужно сбросить failbit, чтобы попробовать что-то другое. Команда, чтобы сделать это довольно просто:

cin.reset(); 
+0

Похоже, что вызов 'getline' устанавливает failbit – Jake

+1

@Jake: Итак, прямо перед' getline', 'if (cin) cout <<« Все в порядке »<< endl;' и после getline, 'if (! cin) cout << "cin failed" << endl; 'оба печатаются? Вы перенаправляете входные данные из файла? 'getline' не очень придирчив к входному формату, я не могу думать, что может привести к его провалу, кроме окончания потока. –

+0

Да, эти обои печатаются, и я не уверен, что вы имеете в виду, но я ничего не делаю (намеренно) с файлами, просто пытаюсь прочитать консольный ввод: \ – Jake

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