我是 C++ 新手,最近通过 u-demy 讲座学习了指针和参考资料。讲座结束后,我正在解决使用单独的函数反转字符串的问题。我想出了一个代码,但由于某种原因,我可以使用 [] 表示法访问单个字符(就像reverse[0]等于!)但是当我打印整个字符串时,我得到一个空字符串?是什么导致了这个问题?
提前感谢您的宝贵时间!
这里我粘贴了我的代码:
#include <iostream>
// using namespace std;
std::string reverse_string(const std::string &str) {
std::string reversed;
size_t size {str.length()};
for(int i{}; i < size/2; i++) {
reversed[i] = str[(size-1)-i];
reversed[(size-1)-i] = str[i];
}
return reversed;
}
int main() {
// Write C++ code here
std::string input = "Hello, World!";
std::string reversed = reverse_string(input);
std::cout << reversed << std::endl; //I get nothing, BUT
std::cout << reversed[0] << std::endl //here I do get a '!'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最初的问题是没有为std::string reversedin function保留空间reverse_string()。这将创建并返回一个空的std::string.
不operator[]执行边界检查。这是您第一次出现未定义行为。
将括号中的数字视为内存偏移量。如果您不打开它们,则不会检查偏移量是否仍在字符串拥有的内存块内。
我们看到的main()是次要问题。reverse是一个空字符串(因为它reverse_string()总是返回,见上文)。并且reverse[0](另一个越界访问,因此未定义的行为)是“!” 因为您错误地将其设置为该值。
要解决此问题,reversed请使用 的容量str.size()或简单地作为 的副本进行初始化str。
为了防止出现此类问题,请打开所有编译器警告并进行调试构建。