首页 > 解决方案 > char* 和 std::string 和 const char* 之间的转换

问题描述

我现在正在使用 C++ 使用 PROS 对机器人进行编程。Pros 有一个打印功能,它接收一个 const char*。现在,我正在使用 lvgl 创建自己的屏幕,并且我想复制打印功能。像printf()函数一样,我希望它包含可变参数来实现%d效果(因此它将所有转换%?为相应的值)。现在的问题是关于函数之间的转换。我想制作一个转换函数来将字符串和可变参数转换为完整的字符串。我需要输入的是一个类似于“嘿”的字符串,我不确定类型名称应该是什么。我需要能够获得尺寸,在其中搜索%ds 但我需要该函数返回一个 const char* 以传递到 lvgl 以在屏幕上显示。我在尝试将字符串转换为 const char* 以输出转换函数时遇到了麻烦。

另外,我尝试将输入类型用作 char*,当我输入像“hello”这样的字符串时,会出现错误 [ISO C++11 不允许从字符串文字转换为 'char ' [-Wwritable-strings] ]。但是,当使用 const char时,错误消失了。有谁知道为什么?

感谢大家的热心帮助!

标签: c++

解决方案


char*并且const char*是同一事物的两种风格:C 风格的字符串。这些是带有NUL终止符(0 字节)的一系列字节。要使用这些,您需要使用 C 库函数,例如strdupstrlen等等。这些必须非常小心地使用,因为错过了终止符,这很容易意外做到,可能会导致缓冲区溢出错误形式的巨大问题。

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*.


推荐阅读