如何将std :: basic_string类型转换为char类型的数组?

12

当运行此代码时,我遇到了以下错误:

syslog(LOG_ERR | LOG_USER, "%s",errorString);

无法将‘const string {aka const std::basic_string}’转换为‘const char*’,用于‘void syslog(int, const char*, ...)’的第二个参数,在 Server.cpp 文件的第 478 行 C/C++ 问题。

我正在将程序变为守护进程,并且当使用 cout 输出到 stdio 时,errorString 值可以正常输出,但是在使用 syslog 调用时无法输出。

有没有办法将 std::basic_string(char) 转换为 'const char' 的格式。


1
在这里提交您自己的答案是完全可以接受的。您不需要将其包含在问题中,即使稍后进行编辑也是如此。 - Code-Apprentice
2个回答

10

6
c_str()data()成员函数提供了一个指向包含您的字符串的char_type数组的第一个元素的指针。只要字符串对象本身保持有效且不变(但请注意,可能导致重新分配的操作可能会使指针无效-最好不要存储它),它就是有效的。

2
只有 c_str() 可以保证字符串末尾有终止符。data() 可能指向一个未终止的字符串副本,这对于大多数期望 const char * 的 API 来说是危险的。 - Adrian McCarthy
3
取决于你使用的 C++ 版本。在 C++11 中,data() 也是以空字符结尾的(即使是空字符串也保证有效)。因此,在 C++11 中,c_str()data() 之间唯一的区别就是 const 限定符。 - Matthieu M.
@Matthieu M.:你说得对——我之前看的是旧规范。尽管如此,还有很多人在使用旧库,所以区分可能很重要。另外,c_str()更能表达意图。 - Adrian McCarthy
是的,这个区别真的很重要。无论是非空结尾还是“未定义”的空方面!C++03规范为实现留下了更多的余地,但这样做也打开了更多未定义的漏洞。 - Matthieu M.

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