【发布时间】:2021-12-10 03:59:56
【问题描述】:
我玩过string函数,我写了下面的,显然我将ret字符串中的第一个字符设置在一个越界的地方,但不是异常,我得到一个字符串一个额外的地方。
std::string StringManipulations::rev(std::string s)
{
std::string ret(s.size(), ' ');
for (int i = 0; i < s.size(); i++)
{
std::string ch;
ch.push_back(s[i]);
int place = s.size() -i;
ret.replace(place,1,ch);
}
return ret;
}
我错误地写在一个位置,该位置比我在函数开头指定的原始字符串大小大一。
为什么我们没有收到错误消息?
s = StringManipulations::rev("abcde");
std::cout << s.size();
std::cout << s;
output is : 6 _edcba
有什么帮助吗?
已解决:将 ch 添加为 String 会自动添加一个空终止符,这样我们就可以得到一个 size+1 的新字符串。
【问题讨论】:
-
越界会导致未定义的行为。它可能会导致崩溃,它似乎可以工作,或者它可能会召唤nasal demons。
-
这可能会有所帮助:stackoverflow.com/questions/671703/…
-
是的,感谢您的回复.. 奇怪的是,只要差异大于 1,就会出现异常,否则我们会得到一个大小为 +1 的新字符串。
-
可能是因为字符串是一个字符数组,末尾有一个额外的字符,如“\0”,表明这是字符串的结尾。它可能会有所帮助:tutorialspoint.com/cprogramming/c_strings.htm
-
题外话:该函数在效率和可读性方面看起来都很丑。为什么不(例如)
ret[s.size() - i - 1] = s[i];?另外,如果这不是手动字符串反转练习,我会使用return std::string{s.rbegin(), s.rend()};,或者,因为您已经复制了s(即按值传递),为什么不避免另一个副本:std::reverse(s.begin(), s.end()); return s;。跨度>
标签: c++ string replace reverse stdstring