1

以下のループに入り、最初の命令 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);
    }
4

4 に答える 4

3

おそらく、以前の入力から、入力バッファーに改行文字が残っていますか? これは一般的なエラーです。

プログラムが最初にcin >> xで整数を読み取り、次にgetline(cin, cmdline) で行を読み取るとしましょう。ユーザーは整数を入力し、その後に ENTER キーを押します。cin >> xは整数を読み取りますが、ENTER キーは改行文字として解釈され、入力バッファーに残されます。

その後、プログラムがgetline(cin, cmdline)を使用して完全な行を読み取ると、残りの改行文字だけで構成される非常に短い行が読み取られます。これは、プログラムが「次の読み取りにスキップする」ように見えます。

于 2009-11-16T19:40:28.467 に答える
1

コードに問題はありません。それはあなたが思っていることをしないだけです:) 最初の単語ではなく、入力された行全体を印刷したい場合は、tokens[0]を印刷しないでください。入力行を印刷します。

どちらのセクションも同じことを行います:

  1. 行を文字列に読み込む
  2. その行から istream を作成します
  3. その istream から「tokens」と呼ばれる文字列の配列に単語を読み取ります
  4. 最初の単語を出力する

tokens.at(0) は明らかに最初の単語です。「8」のような引数を探したい場合は、tokens.size() を確認するか、トークンを反復処理します。

于 2009-11-16T19:39:05.847 に答える
0

>>問題は、抽出と getlineが混在していて、バッファに改行 (または他の入力) が残っていることです。"42 abc"やみくもに 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;
}
于 2009-11-16T20:47:16.333 に答える
0

editMode が TRUE であると確信していますか?

于 2009-11-16T19:37:41.780 に答える