何时使用std::string而不是char*?

16

可能是重复问题:
C++ char* vs std::string

我是从C#转来的新手,但我确实更喜欢C++。

我有一个抽象类,其中定义了两个常量字符串(非静态)。 我想知道 const char* 是否是更好的选择。 我还在逐渐掌握 C++ 标准,但我认为在这种情况下没有任何理由使用 std::string (只是通过 printf 写入控制台,而不是附加或编辑字符串)。

在每种情况下,我应该坚持使用 std::string 吗?


是的,它非常灵活,而且你有整个算法集来帮助你。如果你使用一个字符,你可能不得不编写已经存在的相同方法。这将缩短您的工作流程。 - DumbCoder
7
我不同意使用printfcout的比较。我认为C++的输入输出有些难看,而且相当笨重,并且由于它的隐藏全局变量而非常脆弱。 - David Hammen
@DavidHammen:同意。C语言有安全版本的I/O例程,而C++(STL)的I/O则是一团混乱。 - Ed S.
2
@DavidHammen 隐藏的全局变量?我能想到的唯一是地域设置(locale)相关的东西,但这只发生在 C 的输入/输出操作中,而 C++ 流在构造时会获得自己的私有副本。还有什么别的吗? - bames53
1
@bames53 所有的std::ios_base垃圾。它是一个复杂和冗长的混乱,而且更改是永久性的(例如,全局),直到您明确进行另一个更改为止。 - David Hammen
@DavidHammen 好的,我现在明白你的意思了,但是我不会使用“全局”这个术语,只是因为一个流对象是有状态的。 - bames53
5个回答

12

在所有情况下,我应该坚持使用std :: string吗?

是的。

除非您编写高性能多线程记录库并且确实需要知道内存分配何时发生,或者在某些低级协议/驱动程序中调整数据包头部的单个位。

问题在于您从一个简单的char开始,然后需要打印它,所以您使用printf(),然后可能使用sprintf()进行解析,因为std :: stream对于仅一个int转换为字符串来说太过麻烦。这样,您最终会得到一个不安全且难以维护的C / C ++混合。


15
我觉得需要进行解释。 - Ed S.
2
这个规则有两个例外,即二进制数据和C接口。在处理二进制数据时,特别是考虑到你将使用write而不是<<等运算符时,char *更好。如果你正在使用操作系统API,你需要使用char *。此外,char *使你更容易控制内存分配。 - Linuxios
如果您正在调用C函数并转换为C字符串,则二进制数据应使用std :: vector <uchar>,就像调用Win32 COM函数一样。 - Martin Beckett
@MartinBeckett:有时候你想要对精确分配等进行控制。免责声明:我所做的所有C++编程基本上都是C和POSIX API,只是利用了异常和类。我几乎没有使用过STD库。 - Linuxios
@Linux_iOS.rb.cpp.c.lisp.m.sh - 是的,正如我在答案中所说的。如果这些确实是“字节”,请使用char[]或vector<uchar>,如果它们是“文本”并且您正在使用c++,那么在绝大多数情况下没有理由不使用string。许多新的c->C++程序员认为std::stringstream看起来很复杂,我会坚持使用printf()并声称我需要它来控制/提高性能。 - Martin Beckett
显示剩余3条评论

6

我建议使用std::string而不是const char*,因为大多数内置的C++库都使用字符串而不是字符数组。 std::string拥有许多内置方法和工具,给程序员在操作字符串时提供了很强的能力。


4
在所有情况下都应该使用std :: string吗?
在一些情况下,只需要一个普通的char const *,而不需要std :: string。但是,std :: string除了操作之外,还提供了一些其他功能,你可以将其与其他字符串和字符数组进行比较,并且所有标准算法都可以对它们进行操作。
我建议默认情况下使用std :: string(对于成员和变量),然后仅在发现性能降低的原因是它时再进行更改(这是不可能的)。

1
你最重要的特性是已知大小。标准算法可以在 char const* 上工作,只要你有一个大小。 - R. Martinho Fernandes
1
另一个需要注意的问题是与遗留的 C API 进行交互。 - Oliver Charlesworth
1
这个问题和后续的回答中有大量的额外信息。 - joverboard
3
幸运的是,我们有c_str()可以做到这一点。 - K-ballo
@K-ballo:这并不适用于所有情况。例如,如果C API修改了用户提供的缓冲区。虽然通常可以通过复制到和从vector<char>或其他东西来解决这个问题(此时我们又回到了性能论点...)。 - Oliver Charlesworth
显示剩余3条评论

1

当您需要存储一个值时,请使用std::string

当您想要最大的灵活性时,请使用const char *,因为几乎所有内容都可以轻松地转换为它或从它转换。


1
这就像是比较苹果和橙子。std::string是一个容器类,而char*只是指向字符序列的指针。
这真的取决于您想要对字符串做什么。
另一方面,Std::string可以为您提供简单字符串计算和操作函数的快速访问。其中大多数都是简单的字符串操作函数,没有什么花哨的东西。
因此,它基本上取决于您的需求以及如何声明您的函数。 std::string相对于char指针唯一的优势在于它不需要特定的长度声明。

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