- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在下面的代码中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/
我正在尝试用 Java 构建一个字符串,该字符串的长度最多为 3,最少为 1。 我正在根据整数数组的内容构建字符串,如果数组的内容为 -1,我想在字符串中输出一个空字符。否则字符串将包含整数的字符版本
我有一个类,其中有一个方法可以在字符串中包含 NUL 字符的情况下终止程序。具体表达是这样的: stringVar.indexOf('\u0000') < 0 这个字符串是通过 Scanner 从用户
我有一个 wchar_t 数组。我需要在数组中的特定位置添加一个 unicode 空字符。 wchar_t var1[100]; var1[79] = '\u0000'; 我尝试了上面的方法,但出现以
好吧,这听起来可能是重复的,但我已经尝试了所有可能性,例如 str.strip()、str.rstrip()、str.splitline (),还 if-else 检查像: if str is not
System.out.println("-----------------------------------------------------------"); System.out.pr
我有一个奇怪的问题。我从公司内部的许多不同应用程序接收数据,并将这些数据显示在网站上。根据发送数据的系统,数据本身可能在字符串中包含一些奇怪的字符。我的问题是我有一个用户可以搜索以允许其中包含此数据的
我遇到了 aSSL ,这似乎有几年历史了,想知道是否有人有其他“安全”AJAX 连接代码示例?显然,这不如使用 SSL 证书安全,但使用 null character SSL在那里进行攻击(最近针对
我有一个类似于以下内容的 pyspark 数据框: df = sql_context.createDataFrame([ Row(a=3, b=[4,5,6],c=[10,11,12], d='b
我有以下要执行的查询: MyModel.objects.annotate(current_name=Coalesce('nickname', 'name')).order_by('current_na
每当 rails 变量等于 nil(或者实际上每当我使用 rails 代码(参见第 3 个代码示例))时,我的 html 中就会得到一串空字符。 new.html.haml %h1.editable.
我是一名优秀的程序员,十分优秀!