c++ - char* 和 std::string 和 const char* 之间的转换
问题描述
我现在正在使用 C++ 使用 PROS 对机器人进行编程。Pros 有一个打印功能,它接收一个 const char*。现在,我正在使用 lvgl 创建自己的屏幕,并且我想复制打印功能。像printf()
函数一样,我希望它包含可变参数来实现%d
效果(因此它将所有转换%?
为相应的值)。现在的问题是关于函数之间的转换。我想制作一个转换函数来将字符串和可变参数转换为完整的字符串。我需要输入的是一个类似于“嘿”的字符串,我不确定类型名称应该是什么。我需要能够获得尺寸,在其中搜索%d
s 但我需要该函数返回一个 const char* 以传递到 lvgl 以在屏幕上显示。我在尝试将字符串转换为 const char* 以输出转换函数时遇到了麻烦。
另外,我尝试将输入类型用作 char*,当我输入像“hello”这样的字符串时,会出现错误 [ISO C++11 不允许从字符串文字转换为 'char ' [-Wwritable-strings] ]。但是,当使用 const char时,错误消失了。有谁知道为什么?
感谢大家的热心帮助!
解决方案
char*
并且const char*
是同一事物的两种风格:C 风格的字符串。这些是带有NUL
终止符(0 字节)的一系列字节。要使用这些,您需要使用 C 库函数,例如strdup
,strlen
等等。这些必须非常小心地使用,因为错过了终止符,这很容易意外做到,可能会导致缓冲区溢出错误形式的巨大问题。
std::string
是字符串在 C++ 中的表示方式。它们的功能要强大得多,它们可以支持“宽”字符,或者像 UTF-8 这样的可变长度字符集。由于其中没有 NUL 终止符,因此它们不会溢出并且使用起来非常安全。内存分配由标准库处理,您无需过多关注。
您可以根据需要来回转换,但通常最好std::string
尽可能多地坚持使用 C++ 内部。
要将 C++ 转换为 C:
std::string cppstring("test");
const char* c_string = cppstring.c_str();
要从 C 转换为 C++:
const char* c_string = "test";
std::string cppstring(c_string);
请注意,您可以从char*
(mutable) 转换为const char*
(immutable) 但不能反过来。有时会标记某些内容,const
因为您不允许更改它们,或者更改它们会导致巨大的问题。
不过,您实际上不必“转换”,您只需char*
按照自己的方式使用const char*
.
推荐阅读
- python - 矩阵乘法:将矩阵的每一行乘以 Python 中的另一个 2D 矩阵
- c# - 将列表框选定项从一个 wpf 页面发送到另一个页面
- fabricjs - fabricjs 限制对象拖动
- php - bool 查询格式错误,查询名称后没有 start_object
- c# - 从一组文件名中提取模式并放入列表框中
- python - ImportError [E048] 无法从 spacy.lang 导入语言 en
- javascript - 将日期范围与 moment.js 进行比较
- javascript - 检查具有特定值的数组中的一组值是否相等并返回索引
- c# - 自定义验证器不会触发
- sharepoint-2013 - Infopath Sharepoint 表单