首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char*和std::string和const char*之间的转换

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

Stack Overflow用户
提问于 2019-07-15 02:29:21
回答 2查看 722关注 0票数 2

我现在正在使用C++编程一个机器人使用专业。专业人士有一个打印函数,它接受一个const char*。现在,我使用lvgl创建自己的屏幕,并希望复制打印函数。与printf()函数一样,我希望它包含各种参数来执行%d效果(因此它将所有%?转换为相应的值)。现在的问题是函数之间的转换。我想要创建一个转换函数来将一个字符串和变量参数转换成一个完整的字符串。我需要输入一个字符串,它类似于“嘿嘿”,我不确定类型名称应该是什么。我需要能够获得大小,在其中搜索%ds,但我需要函数返回一个const *,以传递到lvgl到屏幕上的pring。我在尝试将字符串转换为const *以便输出转换函数时遇到了困难。

此外,我尝试使用输入类型作为char*,当我输入像"hello“这样的字符串时表示错误[ISO C++11不允许将字符串文字转换为'char‘-Wwritable- string ]。但是,相反,当使用const char时,错误将消失。有人知道为什么吗?

谢谢大家的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-15 02:38:01

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-07-15 02:34:04

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

std::string是字符串在C++中的表示方式。它们的能力要强得多,它们可以支持“宽”字符,或者像UTF-8这样的可变长度字符集。因为没有NUL终结者在这些,他们不能被溢出,是非常安全的使用。内存分配是由标准库处理的,而不必过多地关注它。

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

若要从C++转换为C:

代码语言:javascript
复制
 std::string cppstring("test");
 const char* c_string = cppstring.c_str();

要从C转换为C++:

代码语言:javascript
复制
 const char* c_string = "test";
 std::string cppstring(c_string);

注意:您可以从char* (可变)转换为const char* (不可变),但不能反向转换。有时候事情会被标记为const,因为您不允许更改它们,或者更改它们会导致巨大的问题。

不过,您不必真正“转换”,只需像使用char*一样使用const char*

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57032644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档