std :: string返回不合适的值

时间:2016-08-09 19:57:09

标签: c++ string c++11

我写了一个程序,它使用重复字符计数执行字符串压缩。 C ++中的程序是:

#include<iostream>
#include<cstring>
std::string compressBad(std::string str)
{
    std::string mystr = "";
    int count = 1;
    char last = str[0];
    for (int i = 0; i < str.length();++i)
    {
        if(str[i] == last)
            count++;
        else
        {
            std::string lastS = last+"";
            std::string countS = std::to_string(count);
            mystr.append(lastS);
            mystr.append(countS);
            //mystr = mystr + last + count;
            count = 1;
            last = str[i];
        }
    }
    std::string lastS = last+"";
    std::string countS = std::to_string(count);
    mystr.append(lastS);
    mystr.append(countS);
    return mystr;        
    //return mystr+last+count;
}
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::string str2 = compressBad(str);
    std::cout<<str2;
    /*if (str.length() < str2.length())
        std::cout<<str;
    else
        std::cout<<str2;*/
    std::cout<<std::endl;
    return 0;
}

运行它的几个例子是:

Input : sssaaddddd

Output : ùÿÿ*425

Output it should print : s3a2d5

第二个例子:

Input : sssaaddd

Output: ùÿÿ*423 

Output it should print : s3a2d3

我也在Java中实现了相同的概念,并且它运行良好。 java实现是here

为什么上述代码会出现此问题。

2 个答案:

答案 0 :(得分:6)

您的代码中可能还有其他问题,但我认为这一行可能是罪魁祸首:

std::string lastS = last+"";

在这里,您尝试通过将空字符串连接到结尾来将字符last转换为字符串。不幸的是,在C ++中,这被解释为“获取字符last的数值,然后将其添加到指向空字符串的指针,从而生成指向字符的新指针。”这个指针指向随机内存,因此你看到了垃圾。 (请注意,这与完全不同于Java的工作原理!)

尝试更改此行以阅读

std::string lastS(1, last);

这会将lastS初始化为一个字符串,该字符串仅包含last中存储的字符。

另一种选择是使用ostringstream

std::ostringstream myStr;
myStr << last << count;

// ...

return myStr.str();

这消除了对.append()std::to_string的所有调用,并且可能更容易阅读。

答案 1 :(得分:1)

last + ""没有按你的想法行事。

只是做

mystr.append(1, last);