如果我可以访问单个字符,为什么我的字符串为空?

Jer*_*rry 0 c++ stdstring

我是 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)

Fri*_*ich 5

最初的问题是没有为std::string reversedin function保留空间reverse_string()。这将创建并返回一个空的std::string.

operator[]执行边界检查。这是您第一次出现未定义行为。

将括号中的数字视为内存偏移量。如果您不打开它们,则不会检查偏移量是否仍在字符串拥有的内存块内。

我们看到的main()是次要问题。reverse是一个空字符串(因为它reverse_string()总是返回,见上文)。并且reverse[0](另一个越界访问,因此未定义的行为)是“!” 因为您错误地将其设置为该值。

要解决此问题,reversed请使用 的容量str.size()或简单地作为 的副本进行初始化str

为了防止出现此类问题,请打开所有编译器警告并进行调试构建。