[英]C++ STD Cin error in while loop
為什么當我進入下面的循環並輸入第一條指令cmdstd:getline(std :: cin,cmdInput); 不讀取輸入的輸入。 例如,如果我輸入“b 8”,它應顯示“cmd is b 8”,但它會跳到下一個讀取std :: getline(std :: cin,input); 並顯示“它是b”
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);
}
也許你在輸入緩沖區中留下了一個換行符,來自早期的輸入? 這是一個常見的錯誤。
假設您的程序首先讀取帶有cin >> x的整數,然后讀取帶有getline(cin,cmdline)的行 。 用戶鍵入一個整數,然后按ENTER鍵。 cin >> x將讀取整數,但解釋為換行符的ENTER鍵將保留在輸入緩沖區中。
當你的程序繼續用getline(cin,cmdline)讀取一個完整的行時,它將讀取僅包含該遺留換行符的非常短的行。 這看起來像程序“跳到下一個讀取”。
代碼沒有錯。 它只是沒有你認為應該做的:)如果你想打印輸入的整行而不是第一個單詞,不要打印標記[0]; 打印輸入行。
兩個部分都做同樣的事情:
顯然,tokens.at(0)是第一個單詞。 如果你想查找像“8”這樣的參數,請檢查tokens.size()或迭代標記。
你確定editingMode是真的嗎?
問題是混合>>
提取與函數getline,留在緩沖器中的換行(或其它輸入)。 盲目地使用ignore會隱藏邏輯錯誤,例如輸入"42 abc"
后跟cin >> some_int; cin.ignore(...);
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;
}
謝天謝地,這很簡單 :
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.