-1

家系の名前の文字列から参照コードを作成するためのコードが少しあります。最初にchar母音かどうかを調べ、次にchar配列に残っているそれぞれを検索して、子音を一時的にのみ格納している母音を破棄し、一時をstring元に戻します。コードはCで提供され、C++に変換しました。コードはコンパイルして最初の値を正しく割り当てますが、戻り値の場合、2番目の値をtempに割り当てようとすると失敗します。コードは5秒と4秒を超えているので、最小限の量から始めて、必要に応じてさらに投稿します。stringstring refCode;iftruestring.cpp.h

Protytpe:

string makeRefCode(string lastname, int cNo);

電話:

refCode = makeRefCode(e[c].lastname, cNo); cout << refCode;//Prints nothing

関数定義:

string makeRefCode(string lastname, int cNo)
{
    string tStr;
    unsigned int i, j = 1;
    unsigned int x;
    x = lastname.length();
    tStr[0] = lastname[0];
    cout << tStr[0];//Prints correct value
    for (i = 1; i < x; i++)
    {
        if (!isVowel(toupper(lastname[i])))
        {
            //tStr[j] = lastname[i];//
            j++;
        }
    }
    //refCode[j] = '0'; // add string terminator
    return tStr;
}

bool isVowel(char aChar)
{
    switch (aChar) //<ctype>
    {
        case 'A':
        case 'E': 
        case 'I': 
        case 'O':
        case 'U': return true; break;
        default: return false;
    }
}

この問題を解決しようとすると、アサーション、アクセス違反、および文字列が十分に大きくないことを示しているように見える文字列エラーが発生しました。どんな助けでも大歓迎です。

4

4 に答える 4

5

文字列のサイズが自動的に大きくなることはありません。文字列がゼロの長さで始まる場合(そうするように) 、文字列の最後に文字を追加するtStrためにを使用する必要があります。push_back

tStr.push_back(lastname[0]);

tStr.push_back(lastname[i]);
于 2012-07-30T07:39:11.173 に答える
1

tStr[0]空の文字列で言ってはいけません!確かに、ターゲット文字列は結果を含めるのに十分な大きさである必要があります。またはと言うtStr.push_back(lastname[0]);tStr += lastname[0];、文字列を十分な大きさで初期化し(のようにstd::string tStr(lastname.size()))、完了したら切り捨てます。

于 2012-07-30T07:39:56.390 に答える
1

単一の文字を文字列に割り当てるときは、文字列がそれらの文字を割り当てていることを確認してください。

次のコードは間違っています。

string tStr;
//...
tStr[0] = lastname[0];

の最初の文字に値を割り当てるためtStrです。しかしtStr、この時点では空です。

文字を追加/プッシュバックしたい:

string tStr;
//...
tStr.push_back( lastname[0] );

さらに、姓が空でないことを確認する必要があります。

于 2012-07-30T07:40:55.567 に答える