我写了一个程序,它使用重复字符计数执行字符串压缩。 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
为什么上述代码会出现此问题。
答案 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);