首页 > 解决方案 > 字符串大写将垃圾添加到 char 数组的末尾

问题描述

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

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

string str{ "asdf" };
char* str_c = new char[str.length()];   
for (int i = 0; i < str.length(); i++) {
    str_c[i] = toupper(str[i]);     
}
cout << str_c; // displays ASDF²▌r┐│w²A∙

标签: c++string

解决方案


对于空终止符,您的 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

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

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


推荐阅读