声明成员变量中的字符串与 C 字符串
Posted
技术标签:
【中文标题】声明成员变量中的字符串与 C 字符串【英文标题】:String vs C-string in declaring a member variable 【发布时间】:2013-12-01 18:13:54 【问题描述】:我在一个返回字符串的类中有一个成员函数。 如果我想将返回值设为 C 字符串类型,我需要在声明中做什么?修改后的函数可能有也可能没有 C 字符串参数(可以保留当前参数)。
原来的声明是:
string function(string argument);
【问题讨论】:
Google“C 字符串处理”,有很多有用的结果。 保持函数不变,在需要访问 C 风格字符串的任何地方使用c_str()
成员函数。
将它作为参考传递——也许是一个常量。节省复制操作符
【参考方案1】:
C 风格的字符串是 char
数组,以 \0
封闭,所以:
char* function(string argument);
您也可以考虑通过 c_str()
方法返回一个字符串并从该值中检索一个 C 字符串。
【讨论】:
【参考方案2】:C 字符串只是指向字符串第一个字符的美化指针,用 0 字节标记字符串的结尾。所以,你返回一个 char 指针:
char *function(string argument); // returns pointer to modifiable char buffer
困难的部分是,字符串必须仍然存在于某个地方。例如,您不能返回局部变量的地址,因为它会在函数返回时消失。低级别的方法是,您返回一个从堆分配的指针,使用new char[length+1]
并期望调用者在完成后将它指向delete[]
。但这很容易导致内存泄漏和所有其他有趣的手动内存管理。
更简单的是返回某种包装对象,例如智能指针。但是,到目前为止,最简单且最不容易出错的方法是使用 std::string
作为包装对象,并使用其 c_str()
方法访问 C 字符串...
在一种情况下,返回 C 字符串可能是有意义的:您从一组文字中返回一个字符串文字,就像这个粗略的例子:
return (result>0 ? "positive" : "not positive");
。
在这种情况下,返回指向 const char 的指针,因为文字是只读的,并且不要将它与返回堆中生成的字符串之类的东西混在一起(因为谁会删除它?)。
const char *function(string argument); //returns pointer to string literal
【讨论】:
【参考方案3】:我会通过以下方式声明函数
char* function( const std::string &s );
【讨论】:
【参考方案4】:cstring 标头提供了处理 C 风格字符串的函数 — 以 null 结尾的字符数组。
#include <cstring>
string function(std::string argument);
【讨论】:
以上是关于声明成员变量中的字符串与 C 字符串的主要内容,如果未能解决你的问题,请参考以下文章