2

C++ を使用して単純なコマンド パーサーを作成しています。istream >> を使用して、数字または文字を入力しているかどうかを確認しようとしています。

入力:

a = 10
b = a

パーサー.cpp:

string inputLine, varLeft, equal, varRight;
double varValue
// please see update below
while(getline(cin, inputLine)){
    istringstream stringSplitter(inputLine);
    stringSplitter >> varLeft >> equal;

    if(!(stringSplitter >> varValue)){
        stringSplitter >> varRight;
    }
}    

目標は、コードの後半で、varRight が空の場合、入力行がdoubleリテラルであると想定し、それ以外の場合は変数を表す文字列であると想定します。数字で始まる混合入力に関連する論理エラーがある可能性があることは理解していますが、現時点ではすべての入力が正しくフォーマットされていると想定しています。a入力の 2 行目の が破棄されるのはなぜですか? どのような修正を提案しますか?

アップデート

問題は while ループ ステートメントではなく、while コード ブロックの最後の if ステートメントにあります。

実際のコードでは、ループは実際には while ループではありません。文字列コマンドを保持するベクトル オブジェクトを使用しており、イテレータを使用してベクトルを通過する for ループを使用してそれらを反復処理しています。しかし、コメント者を喜ばせるために、上記で修正しました。

4

1 に答える 1

3

入力関数が失敗した場合、失敗状態をクリアするまで、ストリームはそれ以上の抽出を許可しません。varValueへの入力が失敗したことを確認した後、次のようにしてそれを行う必要がありますstd::basic_ios::clear

if(!(stringSplitter >> varValue)){
  stringSplitter.clear();
  stringSplitter >> varRight;
}

/* not end of input */現時点であなたがどのようにやっているかはわかりませんが(チェックしていないことを願っていますeof()!)、次のことをお勧めします。

while (getline(cin, inputLine)) {
  // ...
}

これは、ループに入る前に行入力が成功したことを確認します。

于 2013-03-03T21:18:13.867 に答える