【问题标题】:conversion between char* and std::string and const char*char* 和 std::string 和 const char* 之间的转换
【发布时间】:2022-01-30 18:31:54
【问题描述】:

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

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

感谢大家的热心帮助!

【问题讨论】:

标签: c++


【解决方案1】:

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 是因为您不允许更改它们,或者更改它们会导致大问题。

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

【讨论】:

  • char* 和 const char* 有什么区别,如何在它们之间进行转换?谢谢!
  • c_str() 是一种方式,std::string 构造函数也接受 C 字符串。
【解决方案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

【讨论】:

  • 非常小心存储通过std::string::c_str()获得的指针。我遇到并修复了许多情况,即使是经验丰富的程序员也错误地从超出范围的字符串存储此指针:最常见的是直接从返回 std::string 右值的函数调用时(例如 const char* time_bomb = get_some_string().c_str()
猜你喜欢
  • 2014-05-05
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多