我有一些代码是从姓氏的字符串中生成引用代码。它应该是第一个char
是否为元音,然后搜索数组中的每个剩余char
,仅丢弃存储辅音的元音,只返回临时string
,然后返回临时string
} string refCode;
代码是在C中给我的,我把它转换为C ++。代码编译正确分配第一个值,但如果if
返回true
,则在尝试将第二个值分配给临时string
时将失败。该代码超过5个外部.cpp
和4个.h
s,因此我将以最小金额开始,并根据需要发布更多内容。
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;
}
}
由于我已经尝试解决这个问题,我得到了断言,访问冲突和字符串错误,似乎它说字符串不够大。任何帮助将不胜感激。
答案 0 :(得分:5)
字符串不会自动增大。如果你的字符串从零开始(如tStr
那样),那么你需要使用push_back
将字符添加到字符串的末尾。
tStr.push_back(lastname[0]);
和
tStr.push_back(lastname[i]);
答案 1 :(得分:1)
你不能在空字符串上说tStr[0]
!当然,目标字符串必须足够大才能包含结果。要么说tStr.push_back(lastname[0]);
或tStr += lastname[0];
,要么将字符串初始化得足够大(比如std::string tStr(lastname.size())
),然后在完成时将其截断。
答案 2 :(得分:1)
为字符串分配单个字符时,请确保字符串已分配这些字符。
以下代码错误:
string tStr;
//...
tStr[0] = lastname[0];
因为,它为tStr
中的第一个字符赋值。但此时tStr
为空。
你想追加/ push_back字符:
string tStr;
//...
tStr.push_back( lastname[0] );
此外,您应确保姓氏不为空。
答案 3 :(得分:1)
您需要添加0长度的检查:
if (x==0) ....
您需要将代码tStr[j] = ...
替换为:
tStr.push_back(lastname[i]);