当前位置: 首页 > 知识库问答 >
问题:

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

堵乐
2023-03-14

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

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

谢谢大家的帮助!

共有2个答案

颜畅
2023-03-14
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
乐正浩言
2023-03-14

< code>char*和< code>const char*是同一事物的两种风格:C风格的字符串。这些是带有< code>NUL终止符(0字节)的一系列字节。要使用这些,您需要使用C库函数,如< code>strdup、< code>strlen等。必须非常小心地使用这些方法,因为在终止符上遗漏这些方法很容易发生意外,会导致缓冲区溢出错误等巨大问题。

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

您可以根据需要来回转换,但是通常最好尽可能地坚持使用C中的< code>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*,就像使用constchar*一样。

 类似资料:
  • 路径与之间可以隐式转换,这使得可以将它们与over files API一起使用,例如作为的参数 现在很容易看到到的转换,因为它有一个接受类型的非显式构造函数。但是,我似乎找不到隐式地转到的方法。 有一个函数,但它是,而不是。使用 这段代码可以很好地编译icc、gcc和clang,但不能编译MSVS,在MSVS中会出现错误: 那么,哪个编译器是对的呢?是否存在隐式转换序列,或者编译器只是有所帮助?

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

  • String转换到Byte数组时,每个byte(byte类型其实就是uint8)保存字符串对应字节的数值。 注意Go的字符串是UTF-8编码的,每个字符长度是不确定的,一些字符可能是1、2、3或者4个字节结尾。 示例1: package main import "fmt" func main() { s1 := "abcd" b1 := []byte(s1) fmt.Pri

  • 问题内容: 之间有什么区别 和 问题答案: 仅当对象 实际上是 字符串时,才强制转换为字符串: 当对象是其他对象时,它将不起作用: 但是,您将尝试将传递给它的任何内容转换为。它使用该对象的来处理原语()和对象(): 请特别注意最后一个示例:传递给将返回字符串。

  • 本文向大家介绍详谈C# 图片与byte[]之间以及byte[]与string之间的转换,包括了详谈C# 图片与byte[]之间以及byte[]与string之间的转换的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇详谈C# 图片与byte[]之间以及byte[]与string之间的转换就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 有没有办法将a 变成a 或将一个字母变成a (例如如何将a 变成a 和a 变成an )?(如果可以,请链接到相关文档)。 我该如何找到在文档中才隐约知道的类似内容? 问题答案: 您可以通过确定可能涉及的类来查找文档。在这里,候选人是和。 您应该先熟悉以下内容: 原始包装 中的Java Collection框架 它还有助于通过教程更慢地介绍API。 处理字符串中的字符

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

  • 我正在使用hibernate将对象映射到数据库。客户端(一个iOS应用程序)以JSON格式向我发送特定对象,我使用以下实用程序方法将其转换为真实的表示形式: 但问题是,在我的pogo中,我将值存储为一个byte[],如下所示(因为这是存储在数据库中的内容--一个blob): 当然,现在转换失败了,因为它不能在一个byte[]和一个字符串之间进行转换。 这里最好的方法是更改构造函数以接受字符串而不是