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

3
我现在正在使用C++编写一个机器人程序,使用PROS。PROS有一个print函数,它接受一个const char *参数。现在,我正在使用lvgl创建自己的屏幕,并想复制print函数。就像printf()函数一样,我想包含可变参数来实现%d效果(因此它将所有%?转换为相应的值)。现在的问题是关于函数之间的转换。我想制作一个转换函数,将字符串和可变参数转换成完整的字符串。我需要输入一个类似于“hey”的字符串,但不确定类型名称应该是什么。我需要能够获取大小,在其中搜索%d,但我需要该函数返回一个const char*以传递到lvgl以在屏幕上打印。我试图将字符串转换为const char*以输出转换函数,但遇到了麻烦。
此外,我尝试将输入类型设置为char*,当我输入类似于“hello”的字符串时,它会显示错误[ISO C++11不允许从字符串字面值转换为'char'[-Wwritable-strings]]。但是,当我使用const char时,错误消失了。有人知道原因吗?
感谢大家的帮助!

我建议你研究一下像printfvsprintf这样的函数的源代码,以了解它们的工作原理。 - undefined
这是打印函数:https://code.woboq.org/userspace/glibc/stdio-common/printf.c.html 看起来很简单,我甚至没有看到处理"%d"的部分。 - undefined
@EdenCheung 这个问题在__vfprintf_internal函数中处理。你可以在这里看到具体的代码:https://github.com/lattera/glibc/blob/master/stdio-common/vfprintf.c 这并不容易。 - undefined
我找不到 _vfprintf_internal...你能给我解释一下它的逻辑吗?非常感谢。 - undefined
1
可能是如何将std::string转换为const char或char的重复问题。 - user10957435
此外,你还可以查看我的回答来快速了解C++中字符串的类型。 - user10957435
2个回答

3

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之间有什么区别,以及如何在它们之间进行转换?谢谢! - undefined
1
c_str()只能将std::string转换为C字符串,而std::string的构造函数也可以接受C字符串作为参数。 - undefined

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

2
在存储通过std::string::c_str()获取的指针时,要非常小心。我遇到过很多情况,即使是经验丰富的程序员也会错误地存储这个指向超出作用域的字符串的指针:最常见的情况是直接从返回std::string右值的函数中调用(例如const char* time_bomb = get_some_string().c_str())。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接