为什么返回不如预期的那样提供一些随机字符串

问题描述 投票:0回答:4

所以问题得到了一个字符串,类似于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;
}
c++ string char return
4个回答
2
投票

问题是这里:

str[0]+"."+str[pos+1];

不是构造字符串。它将char*添加到一些字符中,有效地执行了一些无效的指针算法。像这样修复它:

std::string otp = str[0] + std::string(".") + str[pos + 1];

现在std::string(".")正确地制作了一个std::string,并根据需要使用std::stringoperator+附加了这些字符。


0
投票

因此,您希望字符串中每个单独的单词的第一个字母大写吗?这样的事情应该起作用。

std::string input = "Sam Harris";
std::string output = "";

auto n = input.find(" ");

while (n++ != input.npos)
{
    output += std::to_upper(input[0]);
    inout = input.substr(n, input.size() - n);
    n = input.find(" ");
}

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();
}

-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 '';
}

显然,您必须归纳为任意数量的空格。

© www.soinside.com 2019 - 2024. All rights reserved.