字符串大写会在 char 数组的末尾添加垃圾

Aru*_*tel -1 c++ string

我正在学习 C++,我编写了一些代码将字符串转换为大写并显示它。我用“asdf”分配一个字符串 str,然后创建一个 char 数组指针并分配与该字符串相同的长度。

\n

但是,当我尝试显示 char 数组时,用大写字符分配 char 数组的索引后,末尾会附加许多垃圾字符。为什么会发生这种情况,因为我只分配了大小=“字符串长度”的字符数组,那么即使在实际分配的大小之后,字符数组如何在末尾有垃圾字符。

\n
string str{ "asdf" };\nchar* str_c = new char[str.length()];   \nfor (int i = 0; i < str.length(); i++) {\n    str_c[i] = toupper(str[i]);     \n}\ncout << str_c; // displays ASDF\xc2\xb2\xe2\x96\x8cr\xe2\x94\x90\xe2\x94\x82w\xc2\xb2A\xe2\x88\x99\n
Run Code Online (Sandbox Code Playgroud)\n

Ish*_*ael 5

对于空终止符,您的 char 数组需要比字符串的长度长一个字符

string str{ "asdf" };
char* str_c = new char[str.length() + 1];   
for (int i = 0; i < str.length(); i++) {
    str_c[i] = toupper(str[i]);     
}
str_c[str.length()] = '\0';
cout << str_c; // displays ASDF
Run Code Online (Sandbox Code Playgroud)

在 C 样式字符串 (char*) 中,字符串的长度不存储在内存中。因此,它必须使用其他方式来确定字符串的结束位置。它的方法是假设字符串是直到等于零的字节(所谓的空终止符)为止的所有字节。

如果没有为空终止符显式分配额外的字节并设置它,您的字符串将继续处理恰好位于您分配的字节之后的垃圾,直到它(意外地)遇到最接近的 0。