0

cinそのため、 andswitchステートメントを使用するときにいくつか問題があります。最初に、プログラムは次のプロンプトを表示しますint

cout << "How many registers would you like to use?: ";
cin >> kassor;

後で、ユーザーは選択を求められます。

    cout << endl << "Press \"S\" to run the queue simulator and/or make a timestep." << endl;
    cout << "Press \"Q\" to quit." << endl << endl;
    cout << "Choice: ";
    cin >> choice;

    switch (choice)
    {
        case 's':
        case 'S':
        {
            cout << "test";
            nya = newCustomers();
            break;
        }
        case 'q':
        case 'Q':
        {
            return 0;
        }
    }

ここで、「q」オプションは正常に機能しますが、「s」オプションは機能しません。まだ入力を待っているかのように、「ハング」します。などなど色々試しcin.ignore()ましたがだめでした。

私を困惑させるのは、

switch (choice)
{
    case 's':
    case 'S':
    {
        cout << "test";
        nya = newCustomers();
        break;

何も与えませんが、次のとおりです。

switch (choice)
    {
        case 's':
        case 'S':
        {
            cout << "test";
            cin.ignore(1024, '\n');
            nya = newCustomers();
            break;

「テスト」を出力します。

cinここでの私の主な質問は次のとおりですcase: s

前もって感謝します :

4

3 に答える 3

1

への入力後、関数newCustomersが 1 つか 2 つの迷子になっているようchoiceです。それは、呼び出しが問題を「修正」する理由を説明しignore、@TheBuzzSaw のコメントで提案された解決策です。

これをより明確に表示するには、次のように変更します。

cout << "test";

cout << "test\n";

または

cout << "test" << std::endl;

一部のシステムでは、コンソールが行バッファリングされているため、プログラムが改行を書き込むまで出力が表示されません。挿入endlすると出力バッファーがフラッシュされるため、後続のコードがハングしてもメッセージが表示されるはずです。または、次のように変更します。

cerr << "test\n";

cerr見逃したくないエラー出力に使用されるため、バッファーのフラッシュについてより積極的です。

于 2012-08-23T15:27:00.780 に答える
0

簡単な回答: cin がどこかで失敗しているか、それが予期しない動作の原因であると思います。コードを追加しないと正確に特定できません。

編集:あなたの投稿にコメントを投稿できないので、ここに投稿することにしました。「ハングアップ」は無限ループになる可能性があります。私がやっているようなことをしていて、ループして入力を取得し、エラービットのクリアに失敗した場合、cin は常に失敗します。入力を求めるたびに何かを計算していない場合は、入力収集関数をループして静かに座っている可能性があります。すべてのループにブレークポイントを配置し、デバッガーでステップ実行して、ループが無限ループになっていないことを確認します。

std::cin.clear(); を追加してみてください。2 番目のテスト ケースの .ignore() の前。それがあなたのぶら下がりを止めるかどうか見てください。

説明:

cin は失敗する可能性があります。これにより、奇妙な動作が発生する可能性があります。失敗する一般的な方法は、整数を読み取っていて文字入力を取得した場合です。cin が失敗すると、失敗ビットが設定され、それ以降、cin は期待どおりに動作しません。

失敗する可能性があり、それを知らないため、bare cin >> の選択を使用しないことをお勧めします。これを、必要な適切な入力を取得するメソッドに抽象化します。

私は個人的に小さなユーティリティ ライブラリ (.h) と .cpp を保持して、既にコーディングした共通機能を使用するプロジェクトに含めます。

2 つの整数を受け入れ、標準入力からこれら 2 つの数値の間の整数を読み取る readIntBetween() 関数があります。ユーザーが正しい入力 (範囲を超えるまたは下回る整数、または文字を含む入力) を提供しない場合は、入力を再入力するように求めます。

この関数では、失敗を検出したときに必ず失敗ビットをクリアし、200 文字などを無視して「フラッシュ」します。

これが私の readIntBetween 関数のコードです。エラーの診断と修正に役立つことを願っています。

int readIntBetween(int lower, int upper, std::string prompt)
{
    bool goodVal = false;
    int value = -1;
    do
    {
        std::cout << prompt ;
        std::cin >> value;

        if ( value >= lower && value <= upper)//check to make sure the value is in between upper and lower
            goodVal = true;
        else
        {
            if(std::cin.fail())
            {
                std::cout << "\tError - invalid format for integer number" << std::endl;

                //clear all status bit including fail bit
                std::cin.clear();

                //flush input buffer to discard invalid input
                std::cin.ignore(1000, '\n');

            }
            else
            std::cout << "Value is not valid, must be between " << lower<<" and "<<upper<<"."<<std::endl;
        }



    }while(!goodVal);
    return value;
}
于 2012-08-23T15:28:40.670 に答える
0

あなたcinがループ内で使用されている場合は、別のアプローチをお勧めします。

char buffer[64];
cin.getline(buffer, 64);

char choice = buffer[0];

switch (choice)
{
    ...
}

あなたcinがリセットされていない可能性があり、余分な文字が後続の入力要求に送られています。より多くの入力を取得し、最初の文字のみを処理します。

于 2012-08-23T15:38:20.927 に答える