gpt4 book ai didi

c++ - 该函数返回空字符串

转载 作者:太空狗 更新时间:2023-10-29 23:38:45 24 4
gpt4 key购买 nike

在下面的代码中reverse函数返回一个空字符串。没有编译错误。

什么会导致这里的问题?

#include <iostream>
#include <bits/basic_string.h>
using namespace std;

string reverse(string str) {
string r;

for (int i=str.length()-1; i>=0; i--) {
r[str.length() - 1 - i] = str[i];
}

return r;
}

int main() {
string str = "ABCDefgh";

cout<<"Reverse string is : "<<reverse(str)<<endl;

return 0;
}

编辑: r[str.length() - i] = str[i];
r[str.length() - 1 - i] = str[i];

最佳答案

您的函数正在调用未定义的行为,因为在使用其 [] 运算符将字符分配给 r< 之前,您没有为 r 字符串分配任何内存std::string::operator[]不执行任何边界检查,因此您实际上是在破坏周围的内存。此外,您也没有正确索引到 r(您的索引偏移了 1)。

你用过std::string::at()吗?方法而不是 operator[],它会引发运行时异常,提示您越界访问字符。

您需要先对输入的str 进行复制,然后您可以反转该拷贝的字符,例如:

std::string reverse(std::string str) { 
std::string r = str; // <-- COPY HERE

for (int i = str.length()-1, j = 0; i >= 0; --i, ++j) {
r[j] = str[i];
}

return r;
}

或者,您可以使用 std::string::resize()方法预分配r 字符串,然后使用operator[] 将有效:

std::string reverse(std::string str) { 
std::string r;
r.resize(str.length()); // <-- ALLOCATE HERE

for (int i = str.length()-1, j = 0; i >= 0; --i, ++j) {
r[j] = str[i];
}

return r;
}

或者,您可以使用 std::string::push_back()方法代替(可选择使用 std::string::reserve() 方法以避免在推送时重新分配):

std::string reverse(std::string str) { 
std::string r;
r.reserve(str.length()); // <-- OPTIONAL

for (int i = str.length()-1; i >= 0; --i) {
r.push_back(str[i]);
}

return r;
}

或者,看看用 std::reverse_copy() 替换您的手动循环算法代替:

#include <algorithm>

std::string reverse(std::string str) {
std::string r;
r.resize(str.length());
std::reverse_copy(str.begin(), str.end(), r.begin());
return r;
}
#include <algorithm>
#include <iterator>

std::string reverse(std::string str) {
std::string r;
r.reserve(str.length()); // <-- OPTIONAL
std::reverse_copy(str.begin(), str.end(), std::back_inserter(r));
return r;
}

但是,话虽这么说,因为输入 str 是按 传递的,所以它已经是您传递给函数的任何字符串的拷贝,所以您不需要' 实际上根本不需要本地 r 字符串。您可以就地反转输入 str 的字符,只是用来考虑源字符串和目标字符串是相同的字符串,因此相应地调整您的循环:

std::string reverse(std::string str) { 
int count = str.length() / 2;
for (int i = 0, j = str.length()-1; i < count; ++i, --j) {
char ch = str[i];
str[i] = str[j];
str[j] = ch;

// alternatively:
// std::swap(str[i], str[j]);
}

return str;
}

或者,看看 std::reverse()算法代替:

#include <algorithm>

std::string reverse(std::string str) {
std::reverse(str.begin(), str.end());
return str;
}

或者,您可以使用将 2 个迭代器作为输入的 std::string 构造函数,因为 std::string 具有 reverse iterators可用:

std::string reverse(std::string str) { 
return std::string(str.rbegin(), str.rend());
}

关于c++ - 该函数返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55940308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com