2

ユーザーからの入力を読み取る必要があります。入力値は、文字列型またはint型の場合があります。値が次の場合int、プログラムは値をオブジェクトに挿入します。それ以外の場合、値が文字列の場合はその文字列の値をチェックする必要があり、「終了」の場合はプログラムが終了します。

Halda h; //my object
string t;
int tint;
bool end=false;

while(end!=true)
{
    if(scanf("%d",&tint)==1)
    {
        h.insert(tint);
    }
    else if(scanf("%s",t)==1)
    {
      if(t=="end")
          end=true;
      else if(t=="next")
          if(h.empty()==false) 
              printf("%d\n",h.pop());
          else 
              printf("-1\n");
    }
}

問題は、文字列のスキャンが正しく機能していないように見えることです。私はそれを次のように変更しようとしました:if(cin>>t)そしてそれはうまくいきました。で動作させる必要がありscanfます。

4

3 に答える 3

1

形式の指定子%sは、ではなく を想定しています。scanf()char*std::string

C11標準から(C++標準はC標準ライブラリについてそれを参照します):

% 指定子の場合を除き、入力項目 (%n ディレクティブの場合は入力文字数) は、変換指定子に適した型に変換されます。入力項目が一致するシーケンスでない場合、ディレクティブの実行は失敗します。この状態は一致の失敗です。割り当ての抑制が * で示されていなければ、変換結果は、変換結果をまだ受け取っていないformat引数に続く最初の引数が指すオブジェクトに配置されます。このオブジェクトに適切な型がない場合、または変換の結果をオブジェクトで表すことができない場合、動作は undefinedです。

とにかく、ここでは C の方法を好む本当の理由はありません。C++ 機能を使用してください。また、C ライブラリを使用する場合は、特定の制限までの文字のみを読み取る安全な関数を使用してください ( のようfgetsに、またはscanf幅指定子を使用して)。そうしないと、オーバーフローが発生し、未定義の動作が再び発生し、再運。

于 2012-11-24T18:20:55.000 に答える
0

これは、入力の終わりをチェックするための本当に悪い方法です。整数または文字列を使用します。

文字列を選択した場合は、からに変換するための規定を作成します。stringint

私の論理は、最初に整数に変換できるかどうかを確認することです。可能な場合は、ロジックを続行します。それが不可能な場合 (floatまたはdoubleまたはその他の場合などstring)、無視して次に進みます。Halda可能な場合は、のオブジェクトに挿入します。

補足: C++ を使用している場合はscanf()andを使用しないでください。printf()

于 2012-11-24T18:20:53.587 に答える
0

stringこのプログラムを参照すると、std::sring動作が定義されていないと仮定します。std::string実際には使用できませんsscanf()内にバッファを設定しstd::stringてそこに読み込むことはできますが、文字列のサイズは変わりません。おそらく、ストリームを使用する方が良いでしょうstd::string(まあ、私の意見では、常にストリームを使用する方が良いでしょう)。

于 2012-11-24T18:21:26.840 に答える