2

やあみんな私はプロジェクトのコードの一部を書いています、そして私は一つのことに固執しています。これが良いコーダーがいつか自分で理解するものである場合(私は良いものになりたいので、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)
4

4 に答える 4

2

この行は間違っています:

cin >> temp_start_hour >> colon >> temp_start_min;

意味:intを読み取り、次に文字列を読み取り、最後に別のintを読み取ります。変数の値colonはまったく読み取られません。

次のコードを試して、どのように動作するかを確認できます。

string sep = ":";
int a, b;

cin >> a >> sep >> b;

cout << a << endl;
cout << sep << endl;
cout << b << endl;
于 2011-10-08T06:33:43.613 に答える
1

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

于 2011-10-08T06:53:32.503 に答える
0

問題は変数のタイプにありますcolon。修正は非常に簡単です。タイプをcolonからstringに変更するだけcharです。

//string colon = ":"; //commenting out the old code
char colon; //new code : no need to initialize it

タイプが文字から始まり、スペースに遭遇するまでのすべての文字を読み取る場合、実際には、と呼ばれる単一の文字のみを読み取ることを意図しているため、なぜstring colon問題が発生するのですか。そのため、正しいデータ型はです(または選択することもできます)。stringcin':'':'charunsigned char

于 2011-10-08T09:22:15.460 に答える
-1

c変数をインクリメントしていません

于 2011-10-08T05:57:26.667 に答える