0

こんにちは、再び Stackoverflow です。C++ プログラミング クラスについて質問します。私が直面している問題は、主にキーボードからのユーザー入力によるものです。ユーザー入力を取得して、呼び出す関数と関数に与える引数を決定できる必要があります。たとえばadd 5、引数5を指定してadd関数を呼び出すようなものです。最初に、>>演算子をオーバーロードして文字列とintの両方を取得しようとしましたが、私が遭遇した問題は、プログラムが次のようなintなしで入力を取得できないことでしたdeletemaxだから私はその考えを捨てなければなりませんでした。入力のトークン化に戻りましたが、このプログラムに Boost を使用することは許可されていないため、sstream を使用してこのようなものを思いつきました

    bool out = false;
string token;
string In;
int num;

do
{
    cout << "heap> ";
    cin >> In;
    istringstream iss(In);
    while(getline(iss, token, ' '))
    {
      cout << token << endl; //I know this is incorrect but just not what to replace it with
    }
    out = ProcessCommand (token, num); //Takes string and int to call correct functions
} while (out != true);

問題は、文字列を正しくトークン化する方法がよくわからないため、2 つの文字列を取得して 2 番目の文字列を int に変換できることです。誰か助けてくれませんか?大変ありがたく存じます。また、私が試みているよりも良い方法があれば、それも聞きたいです。

あなたが私に与えることができるどんな助けにも感謝します.

4

3 に答える 3

1

「C++ string tokenize」をグーグルで検索すると、多くのヒットが得られます。最初のヒットは Stackoverflow です。しかし、あなたはそれを突き刺すべきです。練習のポイントだと思います。

あなたは「argumentS」と言いました。これは、サポートするコマンドがさまざまな数の引数を取ることを示唆しています。私はそれを次のように分解します:

  1. ユーザーから一行読む
  2. スペース境界で行を「トークン」に分割し、トークンをリストに保存します
  3. リストの最初のトークンに基づいて、実行するコマンドを選択します
  4. トークンのリストをコマンドに渡し、それらを引数として検証/解釈できるようにします

トリッキーな部分は#2です。コンテナクラスについてまだ知っていますか? vector<string>解析するチャンクを保存するために使用できます。実際の解析を行うには、文字列の文字を反復処理します。非空白文字が見つかるまで (または文字がなくなるまで)、空白をスキップします。この位置を保存: start. 次に、空白が見つかるまで (または文字がなくなるまで) 非空白をスキップします。この位置を保存: end. startfromと toの間で表される部分文字列をendトークン リストにコピーします。

これの実際の詳細を調べたり、オフバイオンエラーがないことを確認したりすることは、これまでに行ったことがない場合は困難になるでしょう。これがポイントだと思います。

于 2012-04-25T18:42:51.133 に答える
0

1 つの方法はstd::map、関数名をキーとして、必要な数の引数を値として持つことです。入力の 1 行を読み取り、関数名を取得してから、追加の引数が必要かどうかを判断します。vector入力が無効な場合は、文字列ストリームまたは空のベクトルから抽出された引数を返す関数を作成します。

于 2012-04-25T18:46:34.460 に答える
0

ユーザー入力全体を一度に読み込む必要はありません。

たとえば、ユーザー入力の最初のビット (操作、addまたはdeletemaxなど) を読み取ることができます。そこから、操作に応じて、引き続き入力から引数を読み取るか ( の場合add)、すぐに操作の実行を開始できます ( の場合deletemax)。

于 2012-04-25T18:33:56.183 に答える