你如何处理C ++中的字符串?

时间:2008-09-25 13:35:58

标签: c++ string

在C ++中使用字符串最喜欢哪种方式? char的C风格数组?还是wchar_tCStringstd::basic_stringstd::stringBSTRCComBSTR

当然,每个都有自己的应用领域,但无论如何,这是你最喜欢的,为什么?

15 个答案:

答案 0 :(得分:32)

std :: string或std :: wstring,具体取决于您的需求。为什么呢?

  • 他们是标准的
  • 他们是便携式的
  • 他们可以处理I18N
  • 他们有性能保证(按照标准)
  • 防止缓冲区溢出和类似攻击
  • 根据需要轻松转换为其他类型
  • 非常模仿,为您提供多种选择,同时减少代码膨胀并提高性能。真。无法处理模板的编译器现在已经很久了。

C风格的字符阵列只是在寻找麻烦。你仍然需要偶尔处理它们(这就是std :: string.c_str()的用法),但老实说 - C中最大的危险之一就是程序员用char *做着坏事并且清理干净缓冲区溢出。只是不要这样做。

wchar__t的数组是相同的,只是更大。

CString,BSTR和CComBSTR不是标准的,也不是可移植的。除非绝对强迫,否则避免它最理想的是,只需在需要时将std :: string / std :: wstring转换为它们,这不应该非常昂贵。

请注意,std :: string只是std :: basic_string的一个子节点,但除非你有充分的理由不使用std :: string,否则最好还是使用它。真的很好。让编译器在这种情况下处理优化。

答案 1 :(得分:8)

std :: string !!

他们称之为“标准”是有原因的。

basic_string是一个实现细节,应该被忽略。

BSTR& CComBSTR仅用于与COM的interOp,并且仅用于互操作的时刻。

答案 2 :(得分:6)

std :: string除非我需要调用专门接受你列出的其他人的API。

答案 3 :(得分:5)

这是一篇比较C ++中最常见的字符串以及如何在它们之间进行转换的文章。 Unraveling Strings in Visual C++

答案 4 :(得分:4)

如果您可以使用MFC,请使用CString。否则使用std :: string。另外,std :: string适用于任何支持标准C ++的平台。

答案 5 :(得分:3)

当我有一个选择(我通常不这样做)时,我倾向于使用带有UTF-8编码的std :: string(以及UTF8 CPP库的帮助。不是我喜欢std :: string那样的很多,但至少它是标准的和便携的。

不幸的是,在我所参与的几乎所有实际项目中,都有内部字符串类 - 其中大多数实际上比std :: string更好,但仍然......

答案 6 :(得分:3)

我是Qt dev,所以当然我尽可能使用QString:)。

非常好:符合unicode,线程安全的隐式共享(也称为写时复制),它附带了一个旨在解决实际现实问题的API(拆分,连接,替换(有和没有正则表达式) ),转换为数字......或从数字转换......)

如果我不能使用QString,那么std :: wstring。如果你遇到C,我推荐glib GString。

答案 7 :(得分:2)

C风格的char数组有它们的位置,但如果你广泛使用它们,你就会浪费时间调试一个错误。我们有自己的字符串类,可以在我们的(嵌入式开发环境)中使用。

我们不使用std :: string,因为它并不总是适用于我们。

答案 8 :(得分:2)

我尽可能使用std::string(或basic_string<TCHAR>)。它非常通用(就像CStringT),它是类型安全的(不像printf),并且它可以在每个平台上使用。

答案 9 :(得分:2)

其他,std :: wstring。

std :: string是20世纪的技术。使用Unicode,卖给60亿人而不是300万人。

答案 10 :(得分:2)

如果您使用的是MFC,请使用CString。否则我同意大多数其他人,std :: string或std :: wstring一直。

微软可以通过添加std :: basic_string&lt; TCHAR&gt;来为世界带来巨大的好处。在他们最新的MFC更新中超载。

答案 11 :(得分:1)

我喜欢使用TCHAR,它是根据项目设置定义的wchar或char。 它在tchar.h中定义,您可以在其中找到所需的函数和类型的所有相关定义。

答案 12 :(得分:1)

如果可以的话,

std :: string和std :: wstring,如果必须,还有别的东西。

它们可能并不完美,但它们经过了良好的测试,很好理解,而且功能多样。它们与标准库的其余部分很好地配合,这也是一个巨大的奖励。

另外值得一提的是,stringstreams

答案 13 :(得分:1)

Unicode是未来。不要使用char *和std :: string。请 ) 我厌倦了本地化错误。

答案 14 :(得分:1)

std :: string比什么都没有好,但是很遗憾它缺少基本的功能,如分割,连接甚至是一个不错的格式调用......