Jin*_*inx 3 c++ c++11 c++14 c++17
我正在写一个返回字符串的函数。但是发生了一些奇怪的事情。result字符串的输出从控制台打印为意外内容。
根据机器(测试),它会变成中文或其他名称或空字符串。但这仅在输入字符串超长时发生。它通常适用于较小的字符串。
有没有更好的方法附加char到字符串?这是因为我怀疑问题是由我在字符串末尾添加字符的方式引起的。
从控制台
从调试器
main.cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool checkPalindrome(string s)
{
return (s == std::string(s.rbegin(), s.rend()));
}
string longestPalindrome(string s)
{
if (s.size() > 1000 || s.empty())
return "";
string result = "";
string sub = "";
char* ptr = &sub[0];
for (int i = 0; i < s.length(); ++i) {
sub += s[i];
while (true) {
string temp = ptr;
if (checkPalindrome(temp)) {
ptr = &sub[0];
if (temp.length() > result.length()) {
result = temp;
break;
}
break;
}
else {
ptr++;
}
if (ptr == &sub[sub.length()-1]) {
ptr = &sub[0];
break;
}
}
}
std::cout << "end of function" << std::endl;
return result;
}
int main()
{
string output = longestPalindrome("babaddtattarrattatddetartrateedredividerb");
std::cout << output << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该表达式char* ptr = &sub[0];为您提供指向的指针char。但是,在执行时,sub += s[i];您可能需要string增加内部存储空间以容纳新字符。如果您继续添加它,最终它将发生。ptr在重新分配之前,这将使其无效并使其无法使用。
当确实发生了这样的重新分配时,将分配较大的缓冲区,则将先前的值从较短的缓冲区移至较大的缓冲区,然后将较短的缓冲区销毁以替换为较大的缓冲区。但是ptr仍然指向以前的较短缓冲区的数据所在的位置。现在它指向一个被破坏对象的元素。然后,string temp = ptr;您可能会string从无效的指针初始化a ,这是未定义的行为。
一种相对简单的解决方案是坚持使用索引而不是指针。就其性质而言,只要索引位于string大小的范围内,它们就不会失效。另一种可能的解决方案是使用reserve预分配足够大的容量,而不必重新分配它。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |