0

ユーザー入力文字列をさまざまな変数に分割しようとしています。ユーザー文字列の正確な形式は、「Tuesday 6:40 PM」である必要があります。ループが最初のスペースに達すると、残りの変数が満たされるようにプログラムを作成しました。これは、曜日名だけが異なる長さになるためです。私はこれを数回試しましたが、どのような出力も得られないようです。理由を知っている人はいますか?

void input( Time & time ){
    string inputTime;
    string charholder;
    string day;
    string hour;
    string minute;
    string amPm;

    cout << "Enter a day and time: ";
    getline(cin, inputTime);

    for (int i = 0; i < inputTime.length() ; i++) {

        charholder = inputTime[i];
        cout << i << endl;

        if (charholder != " ") {
            day[i] = inputTime[i];
        }

        else {
            hour[0] = inputTime[i+1];
            minute[0] = inputTime[i+3];
            minute[1] = inputTime[i+4];
            amPm[0] = inputTime[i+6];
            amPm[1] = inputTime[i+7];
            break;
        }
    }

    cout << day << hour << minute << amPm; 
}

編集:正しいコード:

void input( Time & time ){
    string inputTime;
    char charholder;
    string day;
    string hour;
    string minute;
    string amPm;

    cout << "Enter a day and time: ";
    getline(cin, inputTime);

    int i = 0;

    while (charholder != ' ') {

        charholder = inputTime[i];
        i++;
    }

    day = inputTime.substr(0,i);
    hour = inputTime.substr(i,1);
    minute = inputTime.substr(i+2,2);
    amPm = inputTime.substr(i+5,2);

    }
4

2 に答える 2

2

にシングルcharを割り当ててstd::stringもOKです。しかし、多くのデフォルトで構築された文字列があり、それらを使用operator[]してインデックスに要素を割り当てようとします。しかし、それらはすべてサイズ 0 であるため、これらの位置は無効です。

std::string foo; // empty string
foo[0] = 'x':    // Oops! foo[0] holds for the null-termination character. Modifying is UB
foo[1] = 'x':    // Oops! foo[1] is out of bounds
于 2013-03-07T22:07:23.077 に答える
1

これにより、長さが0の文字列が作成されます。

string hour;

そして、これは文字列の長さを変更しません

hour[0] = inputTime[i+1];

文字列を特定の長さにする必要がある場合は、std::string::resize()

于 2013-03-07T22:06:51.967 に答える