在C ++ 98中,这是从字符串转换为char *
的合法方法吗?
char * n = (char *) someString.c_str();
(在我原来的措辞中,上述功能是由高级程序员推荐的)
即,这是一种比以下更好的方法:
s2 = (char *)alloca(s0.size() + 1);
memcpy(s2, s0.c_str(), s0.size() + 1);
如果是这样,为什么?
用例:
我需要使用char*
,但我不需要在char*
之后更改数据。我将它传递给显示库。
我只是在寻找一个简短而又甜蜜的答案。谢谢!
编辑:我改变了这个问题的措辞,因为它被投了票。我希望我的重写使它成为一个更好的问题。我认为答案很有趣,很有见地。
记录:任何对此问题感兴趣的人都应该查看所有回复。我只能选一个,但我发现它们都很有趣。
答案 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
不需要以空终止。