簡體   English   中英

while循環中的C ++ STD Cin錯誤

[英]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]; 打印輸入行。

兩個部分都做同樣的事情:

  1. 將一行讀入一個字符串
  2. 從該行創建一個istream
  3. 從那個istream中讀出一個名為'tokens'的字符串數組
  4. 打印第一個單詞

顯然,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM