C++:一般情况下我应该使用字符串还是字符数组?

17

我对程序员在C和C++中编写代码的基本方法有些模糊。其中一个特别的问题是在C++中使用字符串还是字符数组,或者反之。那么,通常情况下应该使用字符串或字符数组,为什么?

我对程序员在C和C++中编写代码的基本方法有些模糊。特别是关于在C++中使用字符串和使用字符数组之间的区别。所以,在一般情况下,是应该使用字符串还是字符数组,以及为什么呢?


2
谢谢大家对std::string的一致感受! - physicsmichael
1
为什么要重复造轮子呢?使用字符串类。 - rocknroll
6个回答

30

在C++中,几乎所有情况下应该使用std::string而不是原始的char数组。

std::string为您管理底层内存,这本身就足以成为首选的理由。

它还提供了一个更易于使用和更可读的接口,用于常见的字符串操作,例如平等测试,连接,子字符串操作,搜索和迭代。


5
易用性是我选择的头号原因。 - Vlad the Impala
4
主要的例外是与现有的 C 库进行接口操作,即使需要输入的库只需从 your_string.c_str() 获取 const char*。 - Mark B

13

如果您正在修改或返回字符串,请使用std::string。 如果不是,除非您绝对需要std::string成员函数,否则将参数接受为const char*。 这使得您的函数不仅可以使用std::string::c_str(),还可以使用字符串字面值。 为什么要让调用者为了传递文字字面量而付出构造带有堆存储的std::string的代价呢?


7
char*类型不能直接转换为string类型。但是可以使用char*类型构造一个string类型,这会引起堆内存的分配和碎片化。(请不要点踩,除非您对我回答的最后一句话有回应) 反过来则可以通过c_str()成员函数实现,这是我在回答中已经提到的。指针既不仅用于向后兼容,也不只用于保存单个值。相反,它们很好地充当了迭代器的角色,所有标准库算法都被精心设计以确保如果迭代器是指针,则能够正确工作。 - Ben Voigt
3
@Ben: +1 我喜欢这个想法,尽管我在实践中没有看到它被广泛使用。我猜这取决于你最终使用字符串的方式。从技术上讲,string是可以从char*转换的:一个非显式的单参数构造函数是一个“转换构造函数”,属于用户定义的转换类别。当然,这并不意味着调用它是廉价的。 - James McNellis
4
哥们,你们这里涉及到了过早优化。所有正常的函数都会通过const引用来接受字符串,除非它们需要一个副本(在这种情况下,使用char也不会提高性能)。因此,将其改为使用char并不能提升性能。除非您的原始字符串是固定在堆栈或编译中,且分析器说应该这样做,否则没有理由使用char代替字符串。如果没有分析器建议同样的事情,那么建议使用char而不是string几乎从来不是一个好主意。 - wilhelmtell
3
以常量引用的方式传递字符串并不能避免构造临时字符串对象以传递字符串字面值。我认为这听起来像是一种合理、简单、不会影响可读性的“过早”优化。 - James McNellis
2
实际上,const char* 不仅可以指向字面量而无需转换,还可以指向 std::vectorstd::string 中间、全局指针或从字面量初始化的输入参数等。在我编写的软件中,几乎所有字符串的使用都属于这些类别之一。虽然本地化时比例会少一些,但并不会少很多。参数解析不会被本地化,日志文件和错误代码也不会(在任何理智的系统中)。对于搜索引擎来说,甚至连错误消息是否应该本地化都是一个问题。 - Ben Voigt
显示剩余7条评论

2

其他人已经提出了这个建议。尽可能使用std::string。但是有些情况下,你需要char *,例如如果你想调用一些系统服务。


3
这就是为什么有std::string::c_str() - swegi
@swegi:许多API期望一个char*而不是一个const char*(例如,大多数WinAPI)。在这些情况下,使用std::vector<char>并根据需要在它和std::string之间进行转换是一个好主意。 - James McNellis
@James McNellis,这就是const_cast的作用。 - mch
@mch:不,没有保证一个接受char*的函数不会修改字符串。如果函数尝试修改字符串,你就会陷入未定义行为的领域。 - James McNellis

2

与所有事情一样,选择取决于你的使用场景。如果你处理的是会变化的字符串数据,那么 std::string 有其真正的价值。但如果你处理的是不会变化的字符串,char[] 在效率上无可匹敌。


1
使用 std::string。你会遇到更少的问题(我认为几乎没有,至少我想不出来)与缓冲区大小有关。

1

C语言有char[],而C++还有std::string...

我经常听到应该“拥抱语言”,按照这个规则,你应该使用std::string...

然而,这基本上取决于你使用的库,该库希望你如何表达字符串等因素。

std::string是一个容器类,在它内部是一个char[]
如果你使用std::string,你会有很多优势,比如一些函数可以帮助你[比较、子串等]


2
如果库太“烂”而不支持字符串,总是可以使用std::string::c_str()! - physicsmichael

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