所以给了问题一个字符串,它是一个像Sam Harris一样的名称,您必须输出它的缩写,我所做的就是在字符串中找到空格,然后取一个字符串otp,它将添加str [0]名字的第一个字母str [pos + 1]在位置后加上字母。在两者之间,但是return语句返回一些随机值。 #include
std::string abbrev(std::string str)
{
int pos{0};
for(int i=0;i<str.length();++i)
{
if(str[i]==' ')
{
pos=i;
break;
}
}
std::string otp=str[0]+"."+str[pos+1];
return otp;
}
int main()
{
std::string str="Sam Harris";
std::cout<<abbrev(str)<<"\n";
return 0;
}
答案 0 :(得分:2)
问题在于,这里:
str[0]+"."+str[pos+1];
不构造字符串。它将char*
添加到一些字符中,有效地执行了一些无效的指针算法。像这样修复它:
std::string otp = str[0] + std::string(".") + str[pos + 1];
现在std::string(".")
正确地制作了一个std::string
,并使用std::string
的{{3}}按预期的方式追加了这些字符。
答案 1 :(得分:0)
因此,您想要字符串中每个单独的单词的第一个字母(大写)吗?这样的事情应该起作用。
std::string input = "Sam Harris";
std::string output = "";
auto n = input.find(" ");
while (n++ != input.npos)
{
output += std::to_upper(input[0]);
input = input.substr(n, input.size() - n);
n = input.find(" ");
}
答案 2 :(得分:0)
str [0]和str [pos + 1]在该位置返回一个字符,类型为char。您不能将char变量添加到常量字符串“。” (双引号)。总的来说,我认为它将每个位置的char值与常量字符串存储地址相加,并将其分配给otp。例如,看您的情况,假定常量字符串“”。地址值为1000。str[0]将返回ascii值为83的'S',而str [pos + 1]将返回ascii值为72的'H'。然后opt将分配一个内存地址1155(83 + 1000 + 72),它将是一个未知的程序存储器,具有垃圾值,将由该函数返回。使用stringstream来合并字符串,如下所示:
std::string abbrev(std::string str)
{
int pos{0};
for(int i=0;i<str.length();++i)
{
if(str[i]==' ')
{
pos=i;
break;
}
}
std::stringstream otp;
otp << str[0] << "." << str[pos+1];
return otp.str();
}
答案 3 :(得分:-1)
不是c ++的人,但是我可以试一试。我怀疑,您得到的是随机的东西,因为您在某些输入中溢出了数组的边界。该修复程序可能会修复您的错误(以下示例,假设您的语法正确)。
std::string abbrev(std::string str) {
for(int i=0;i<str.length()-1;++i) {
if(str[i]==' ') {
return str[0] + '.' + str[i +1];
}
return '';
}
显然,您必须归纳为任意数量的空格。