我现在正在使用C ++使用PROS对机器人进行编程。 Pros具有打印功能,该功能接受const char *。现在,我正在使用lvgl创建自己的屏幕,并且我想复制打印功能。像printf()
函数一样,我希望它包含可变参数以产生%d
的效果(因此它将所有%?
转换为相应的值)。现在的问题是关于函数之间的转换。我想制作一个convert函数,将字符串和可变参数转换为完整的字符串。我需要输入一个类似于“嘿”的字符串,我不确定类型名称应该是什么。我需要能够获取大小,在其中搜索%d
,但是我需要返回const char *的函数以传递到lvgl以便在屏幕上弹起。我在尝试将字符串转换为const char *以获得转换功能的输出时遇到了麻烦。
此外,我尝试将输入类型用作char *,当我输入类似“ hello”的字符串时,提示错误[ISO C ++ 11不允许从字符串文字转换为'char ' [-可写字符串]。但是,当使用const char 时,错误消失了。有人知道为什么吗?
感谢大家的帮助!
答案 0 :(得分:3)
char*
和const char*
是同一件事的两种形式:C型字符串。这些是带有NUL
终止符(0字节)的一系列字节。要使用这些功能,您需要使用C库函数,例如strdup
,strlen
等。必须非常小心地使用这些符号,因为终止符上的所有符号很容易被意外丢失,容易导致缓冲区溢出错误。
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