我现在正在使用C++编程一个机器人使用专业。专业人士有一个打印函数,它接受一个const char*。现在,我使用lvgl创建自己的屏幕,并希望复制打印函数。与printf()函数一样,我希望它包含各种参数来执行%d效果(因此它将所有%?转换为相应的值)。现在的问题是函数之间的转换。我想要创建一个转换函数来将一个字符串和变量参数转换成一个完整的字符串。我需要输入一个字符串,它类似于“嘿嘿”,我不确定类型名称应该是什么。我需要能够获得大小,在其中搜索%ds,但我需要函数返回一个const *,以传递到lvgl到屏幕上的pring。我在尝试将字符串转换为const *以便输出转换函数时遇到了困难。
此外,我尝试使用输入类型作为char*,当我输入像"hello“这样的字符串时表示错误[ISO C++11不允许将字符串文字转换为'char‘-Wwritable- string ]。但是,相反,当使用const char时,错误将消失。有人知道为什么吗?
谢谢大家的帮助!
发布于 2019-07-15 02:38:01
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发布于 2019-07-15 02:34:04
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* (可变)转换为const char* (不可变),但不能反向转换。有时候事情会被标记为const,因为您不允许更改它们,或者更改它们会导致巨大的问题。
不过,您不必真正“转换”,只需像使用char*一样使用const char*。
https://stackoverflow.com/questions/57032644
复制相似问题