在C++中使用字符串的最佳实践

Best practices in Working with strings in C++

本文关键字:最佳 字符串 C++      更新时间:2023-10-16

我目前正在制作一个小型C++工具,我对如何在C++中处理字符串感到有点震惊。这是我第一次需要处理C++,我对Java、C#等强类型的托管语言有很多经验,但我对C++字符串很着迷。

有没有在C++中使用字符串的最佳实践?

许多WIN API函数处理不同类型的"字符串"

tchar、char*、LPWSTR、LPCSTR。。。等将每种类型转换为另一种类型需要我花很多时间来实现。

请建议您在将一种类型转换为另一种类型时处理字符串的方法。也许有图书馆可以用?

简短回答?我的建议是尽可能使用std::stringstd::wstring

std::string strBuffer = "test";
strBuffer += " ... test";
std::string::size_type nStringSize = strBuffer.size();
const char* pszString = strBuffer.c_str();    // pszString contains 
                                              // pointer to memory held 
                                              // by STL string and can be 
                                              // passed into API calls

您可以很容易地获得一个"c风格"字符串(即指向.c_str()的空终止字符数组char*的指针,您可以按原样将其传递到大多数WinAPI函数中。

您提到的大多数其他类型(tcharLPWSTRLPCSTR等)都是C样式数组的typedef(或指向C样式数组或char类型的指针),用于支持多字节字符集上的unicode。

请建议您在将一种类型转换为另一种类型时处理字符串的方法。也许有图书馆可以用?

在c++中,通常(99%的情况)应该使用std::string(或std::wstring)。

如果你陷入1%,当你必须处理c字符串时,你必须格外小心。然后,您需要处理指向char数组和tchar、char*、LPWSTR、LPCSTR类型的指针

正如Robinson所说,如果您已经习惯了托管语言,那么最方便的方法就是使用STDL字符串。w…是宽的(例如用于Unicode),没有w将是8位。

最"传统"的C++(或更好的C)字符串是char*,它是指向内存中字符序列的简单指针,后面是空字节。它不是一个类,只是纯数据,因此您没有关于其长度的先验信息:每次需要长度时,您都必须通过迭代字符来自己计算,直到找到。这正是strlen函数所做的。传统的字符串还有很多其他的辅助函数,包括裁剪、复制、连接等,但它们并不"安全",因为如果分配的原始内存不够,就可以很容易地覆盖字符串后面的一些数据。这是90年代大多数病毒所利用的。

所以,如果您想要安全方便的解决方案,请选择标准模板库字符串。