char *和std :: string和const char *之间的转换

时间:2019-07-15 02:29:21

标签: c++

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

此外,我尝试将输入类型用作char *,当我输入类似“ hello”的字符串时,提示错误[ISO C ++ 11不允许从字符串文字转换为'char ' [-可写字符串]。但是,当使用const char 时,错误消失了。有人知道为什么吗?

感谢大家的帮助!

2 个答案:

答案 0 :(得分:3)

char*const char*是同一件事的两种形式:C型字符串。这些是带有NUL终止符(0字节)的一系列字节。要使用这些功能,您需要使用C库函数,例如strdupstrlen等。必须非常小心地使用这些符号,因为终止符上的所有符号很容易被意外丢失,容易导致缓冲区溢出错误。

std::string是用C ++表示字符串的方式。它们功能强大得多,可以支持“宽”字符或可变长度字符集(如UTF-8)。由于这些中没有NUL终结器,因此它们不会溢出并且确实非常安全。内存分配由标准库处理,而无需您特别注意。

您可以根据需要来回转换,但是通常最好在C ++中尽可能多地坚持使用std::string

要从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*(可变)转换为const char*(不可变),但不能反向转换。有时,某些事情被标记为const,因为不允许您更改它们,否则更改它们会导致巨大的问题。

不过,您实际上不必“转换”,只需像使用char*那样使用const char*

答案 1 :(得分:2)

std::string A = "hello"; //< assignment from char* to string
const char* const B = A.c_str(); //< call c_str() method to access the C string
std::string C = B; //< assignment works just fine (with allocation though!)

printf("%s", C.c_str()); //< pass to printf via %s & c_str() method