c++ - 字符串大写将垃圾添加到 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∙
解决方案
对于空终止符,您的 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。
推荐阅读
- git - 在分支或合并请求特定级别上快进合并
- mysql - 如果 MYSQL 选择查询中的列相同,则删除所有重复项
- linux - 是否有一个 grep 命令允许我 grep 多个文件夹并使用包含文件名的文本文件复制它们
- babeljs - 如何在 svelte/sapper 中使用第 3 阶段语法?
- angular - 如何在 Angular 中实现 ControlValueAccessor 的子组件中获取 NgControl 触摸状态?
- r - 如何从 R 中的地理数据库中提取 GIS 域?
- laravel - 可以在视图中编译的字符串中的刀片变量
- machine-learning - DesicionTreeClassifier:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值
- node.js - 为 Node.js(fastify)服务器创建一个构建到电子应用程序
- git - 配置 Git 以通知隐藏的更改