为什么返回不按预期方式提供一些随机字符串

时间:2019-10-29 07:14:38

标签: c++ string char return

所以给了问题一个字符串,它是一个像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;
}

4 个答案:

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

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