我们如何在C ++中处理字符串?

时间:2020-03-06 14:43:15  来源:igfitidea点击:

在C ++中使用字符串最喜欢的方式是哪种?一个C型的chars数组?还是wchar_t?是CString,std :: basic_string,std:string,BSTR还是CComBSTR?

当然,每种方法都有其自己的应用领域,但是无论如何,这是最爱,为什么?

解决方案

C风格的char数组占有一席之地,但是如果我们广泛使用它们,则会要求我们浪费一个错误进行调试。我们拥有量身定制的字符串类,可在我们的(嵌入式开发环境)中使用。

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

std :: string,除非我需要调用专门采用我们列出的其他API的API。

如果可以使用MFC,请使用CString。否则,请使用std :: string。另外,std :: string在支持标准C ++的任何平台上均可工作。

std :: string !!

他们称其为"标准"是有原因的。

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

BSTR和CComBSTR仅用于与COM进行互操作,并且仅用于互操作时。

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

其他,std :: wstring。

std :: string是20世纪的技术。使用Unicode,并将其销售给60亿人,而不是3亿。

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

如果可以的话,std :: string和std :: wstring,如果需要的话,还有其他东西。

它们可能并不完美,但是它们经过了很好的测试,很好的理解并且用途广泛。它们可以与标准库的其余部分很好地协作,这也是一个巨大的好处。

同样值得一提的是stringstreams。

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

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

C样式的char数组只是在问麻烦。我们仍然需要偶尔处理它们(这就是std :: string.c_str()的目的),但是,老实说-C中最大的危险之一是程序员用char *进行Bad Things并最终陷入困境缓冲区溢出。只是不要这样做。

wchar__t数组是一回事,只是更大。

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

请注意,std :: string只是std :: basic_string的子代,但是使用std :: string还是更好,除非我们有充分的理由不这样做。真的很好在这种情况下,让编译器负责优化。

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

std :: string总比没有强,但令人讨厌的是,它缺少诸如split,join甚至是体面的格式调用之类的基本功能...

当我有选择的时候(我通常没有),我倾向于使用带有UTF-8编码的std :: string(以及UTF8 CPP库的帮助。不是我很喜欢std :: string,但至少是标准且便携式的。

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

我是Qt开发人员,所以当然,我倾向于尽可能使用QString :)。

它非常好:符合unicode的,线程安全的隐式共享(又名写时复制),并且带有旨在解决实际实际问题(拆分,合并,替换(使用和不使用正则表达式),转换)的API到/从数字...)

如果我不能使用QString,则使用std :: wstring。如果我们对C不满意,建议使用glib GString。

取决于应用程序...我已经进行了广泛的嵌入式编程,通常使用字符数组。创建一个新的字符串对象需要花费很多我的大多数字符串操作所浪费的时钟周期。

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

如果我们使用的是MFC,请使用CString。否则,我完全同意其他大多数标准,例如std :: string或者std :: wstring。

Microsoft可以通过在最新的MFC更新中添加std :: basic_string <TCHAR>重载来为世界带来巨大的成功。