c++ - C++ - 来自 std::string 的意外输出
问题描述
我正在编写一个返回字符串的函数。但是奇怪的事情发生了。字符串的输出result
被控制台打印为意外的东西。
根据机器(TESTED),它会变成中文或其他内容或 EMPTY STRING。但这仅在输入字符串超长时才会发生。它通常适用于较小尺寸的字符串。
有没有更好的方法来附加char
到字符串?这是因为我怀疑问题是由我将字符添加到字符串末尾的方式引起的。
从控制台
从调试器
主文件
#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;
}
解决方案
该表达式char* ptr = &sub[0];
为您提供了指向 a 的指针char
。但是,当您执行时,sub += s[i];
您可能需要string
增大 的内部存储空间以容纳新字符。如果你继续添加它,最终它会发生。这将使其无效ptr
并使其无法使用,直到重新分配为止。
当这种重新分配确实发生时,分配了更大的缓冲区,先前的值从较短的缓冲区移动到较大的缓冲区,然后较短的缓冲区被销毁以被较大的缓冲区替换。但ptr
仍指向先前较短缓冲区的数据所在的位置。它现在指向一个被破坏对象的元素。当您这样做时,您会冒着从无效指针string temp = ptr;
初始化 a的风险,这是未定义的行为。string
一个相对简单的解决方案是坚持使用索引而不是指针。只要它们在string
's 大小的范围内,就其性质而言,索引不会失效。另一种可能的解决方案可能是使用reserve
预分配足够大的容量,它永远不必重新分配。
推荐阅读
- spring - 运行时未创建 RabbitMQ 队列
- botframework - 如何在通过 MS Team 的消息扩展功能调用的自适应卡中实现搜索成员功能(类似于赞美应用程序)
- python - 使用 pandas read_excel() 将 .xls 文件格式导入 python 时出现 CompDocError
- node.js - 如何不将多个数据保存到 mongodb 的集合中?
- mysql - MySQL GROUP BY 按周、月查询分组结果
- javascript - 我想分配一个变量两次,但只想在 javascript 中使用第一个
- python - 如何使用 .title() 遍历具有不同数据类型的字典值?
- java - 为什么验证不适用于 DTO 类型的对象,而仅适用于实体
- python - 为什么图表的标题和 x-label 都相同,即使我已经将它们包含在 for 循环中?
- python - 从 Django 中的 db 字段渲染 html