将std :: string转换为char *辩论

时间:2014-07-29 23:31:57

标签: c++ string char

在C ++ 98中,这是从字符串转换为char *的合法方法吗?

char * n = (char *) someString.c_str();

(在我原来的措辞中,上述功能是由高级程序员推荐的)

即,这是一种比以下更好的方法:

s2 = (char *)alloca(s0.size() + 1);
memcpy(s2, s0.c_str(), s0.size() + 1);

(由convert string to char*提供)

如果是这样,为什么?

用例:

我需要使用char*,但我不需要在char*之后更改数据。我将它传递给显示库。

我只是在寻找一个简短而又甜蜜的答案。谢谢!

编辑:我改变了这个问题的措辞,因为它被投了票。我希望我的重写使它成为一个更好的问题。我认为答案很有趣,很有见地。

记录:任何对此问题感兴趣的人都应该查看所有回复。我只能选一个,但我发现它们都很有趣。

4 个答案:

答案 0 :(得分:3)

string::c_str()返回一个const指针,该指针指向以null结尾的C风格字符串,该字符串包含与原始string相同的内容。在大多数常见的实现中,c_str()只返回指向string内部数据的指针(如果它不为空),但C ++标准不要求这样做。

如果您只需要阅读string的内容而不修改它,则无需分配单独的缓冲区,只需单独使用c_str()即可。只要char* / string / =运算符或{{1} +=未被更改,返回的[]就会一直有效}或insert()方法,或迭代器等。

如果您需要通过erase()指针修改string,则必须分配一个单独的缓冲区,将char*内容复制到其中,根据需要进行修改,然后使用自己的方法将新内容复制回string

答案 1 :(得分:0)

你的高级程序员错了。像这样抛弃const-ness至少是错误的(例如,不能保证它指向字符串的实际内存),如果底层对象恰好是const,则会产生未定义的行为。

答案 2 :(得分:0)

这里的答案取决于您是否需要可变字符串或只是为了能够阅读它。

如果您要对char*所做的只是查看内容,那么正如评论所指出的那样,您需要将其分配给const char*(并删除演员表)。

您的方法有效,但如果您只需要读取字符串,则无需将其复制到新位置。

如果您需要修改字符串,那么您的副本将是合适的。但是,您需要注意更改不会反映在原始字符串中。

答案 3 :(得分:0)

首先,memcpy不分配内存。它只会复制从一个地方到另一个地方的东西。

在C ++中,使用memcpy的习语是:

std::string my_string = "California Needs Rain!\n";
char * p_text_string = new char [my_string.length() + 1U];
memcpy(p_text_string,
       my_string.c_str(),
       my_string.length());
// Add the nul terminator
p_text_string[my_string.length()] = '\0';

请记住,分配的内存需要比字符串的长度多1,因为需要附加nul,' \ 0',终止符。

std::string不需要以空终止。