c++ - この「if」ステートメントがループするのはなぜですか?

原文 c++ loops if-statement while-loop do-while

私はプロジェクトのコードの一部を書いていて、私は1つのことにこだわっています。これが優れたコーダーである時点で自分で理解できるものである場合(私はc++で5週目になるとよいので、これまでのところはこれでいいので...)、その試練は、言葉で言って私はねじ込みますが、私は約30分間デバッグしていて、 'if'ステートメントがループしている理由がわかりません。

入力は次のようになります。


p 11:34 12:45


ここでpは、完了したかどうかを示します(アウトしたい場合は「s」になります。ここでは「end」で表されます)。

const int LIST_SPACE = 1000; // this is outside of the main function
string c;                    // and is 1000 because of a parameter set by the teacher
string end = "s";
string start = "p";
int temp_start_hour;
int temp_start_min;
int temp_end_hour;
int temp_end_min;

string colon = ":";
int begin_hours[LIST_SPACE];
int begin_min[LIST_SPACE];
int end_hours[LIST_SPACE];
int end_min[LIST_SPACE];
int i = 0;
do {
    cin >> c; //where c is a string

    if(c != start && c != end)
    {
        cout << "ERROR IN INPUT";
        return 1;
    }

    if(c != end)
    {
        cin >> temp_start_hour >> colon >> temp_start_min;
        cin >> temp_end_hour >> colon >> temp_end_min;
        begin_hours[i] = temp_start_hour;
        begin_min[i] = temp_start_min;
        end_hours[i] = temp_end_hour;
        end_min[i] = temp_end_min;
        cout << begin_hours[i]; //I did this to check if it was storing values
        i++;
    }
 }while(c != end); //ending the do-while loop


私はこの人たちと一緒に正しい方向に微調整していただければ幸いです。または、私が見逃しているコンセプトに関する一般的なアドバイス。ありがとう!

ちなみに私が得ている出力は次のとおりです(これは入力 'p 11:34 12:34'の場合です)。

11111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111Segmentation fault (core dumped)
答え
最初の問題は、「コロン」が「:34」のすべてを取得し、次にstart_minutesが次の1時間になるはずの12を取得することです。しかし、本当の問題は、cinが後続の呼び出しによってピックアップされるストリームに残骸を残すため、これらの呼び出しはスキップして、追加の入力を求め、残った文字をそのまま使用することです。各呼び出しの後にcin.ignore()をkludgyパッチとして使用して機能させますが、より安全な関数を使用して全体を再設計することについては、かなり難しく考えます。
関連記事

c++ - これは、浮動小数点値を使用して入力検証を行う正​​しい方法ですか?

c++ - コンパイル後のC++コンストラクタの本当のシグネチャは何ですか

c++ - Valgrind-初期化されていない値とバイト?

c++ - C++ constオーバーロードとコード共有

c++ - OpenGL 2.1でのglDrawRangeElementsの使用

c++ - POSIX読み取りの一時停止をマイクロ秒の範囲で認識する

c++ - Qtで、モデルからリストビューのアイテムの背景色をリセットするにはどうすればよいですか?

c++ - 実装ファイルでコンストラクタを使用するにはどうすればよいですか?

c++ - cursesライブラリーの使用時にmove()またはwmove()を使用するとカーソルが移動しない

c++ - プログラムでシステム情報を開く