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

时间:2012-03-26 08:02:20

标签: c++ string

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

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

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

tchar,char *,LPWSTR,LPCSTR ......等 并将每种类型转换为其他类型需要花费大量时间让我实施。

请在将一种类型转换为另一种类型时建议您处理字符串的方式。 也许有一些库可供使用?

3 个答案:

答案 0 :(得分:7)

简短回答?尽可能使用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 style”字符串(即char*指向空终止字符数组.c_str()的指针,您可以将其传递到大多数WinAPI函数中。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

  

请在将一种类型转换为另一种类型时建议您处理字符串的方式。也许有一些库可供使用?

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

如果你跌到1%,当你必须处理c弦时,你必须格外小心。然后你需要处理char数组和tchar,char *,LPWSTR,LPCSTR类型的指针