-1

我有一些代码是从姓氏字符串中创建参考代码。它应该首先char考虑元音与否,然后搜索char数组中剩余的每个元音,丢弃仅在 temp 中存储辅音的元音string,然后将 temp 返回stringstring refCode;C 中给我的代码,我将其转换为 C++。代码编译正确地分配了第一个值,但是如果if返回true,它将在尝试将第二个值分配给 temp 时失败string。代码超过 5 个 external.cpp和 4 个.h,所以我将从最少的数量开始,并根据需要发布更多。

原型:

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]);or tStr += lastname[0];,要么初始化足够大的字符串(如 with 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] );

此外,您应该确保 lastname 不为空。

于 2012-07-30T07:40:55.567 回答
1

您需要添加检查 0 长度:

if (x==0) ....

您需要将注释代码替换为tStr[j] = ...

tStr.push_back(lastname[i]);
于 2012-07-30T07:49:13.500 回答