我目前正在制作一个小型C ++工具,我对如何处理C ++中的字符串感到震惊。这是我第一次需要处理C ++,我对使用Java,C#等强类型的托管语言有很多经验,但我对C ++字符串感到厌烦。
在C ++中是否有使用字符串的最佳实践?
许多WIN API函数处理不同类型的“字符串”
tchar,char *,LPWSTR,LPCSTR ......等 并将每种类型转换为其他类型需要花费大量时间让我实施。
请在将一种类型转换为另一种类型时建议您处理字符串的方式。 也许有一些库可供使用?
答案 0 :(得分:7)
简短回答?尽可能使用std::string
或std::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函数中。
您提到的大多数其他类型(tchar
,LPWSTR
,LPCSTR
等)都是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类型的指针