作为一个C ++ noob,我似乎无法做到这一点,即使我知道它应该很简单:{ - 我需要创建一个LPWSTR数组,然后用唯一的字符串填充它。我的想法是做一些简单的事情:
LPWSTR *wszArray = new LPWSTR[5];
for(int x = 0; x < 5; x++)
{
swprintf(wszArray[x], "somestring_%d", x);
}
我知道我没有为LPWSTR分配内存,但在尝试了一些事情后我没有太多运气。此外,我不确定一旦完成字符串后数组是否应该被释放。
任何建议都会很棒。
答案 0 :(得分:2)
你现在拥有的是指向宽字符指针的单个指针。然后,您将使用5个动态分配指针到宽字符的数组的地址初始化它。这样就可以了,但不为字符串本身分配任何空间,仅用于指向5个字符串的指针。然后,您需要为字符串本身分配空间:
for (int i=0; i<5; i++) {
array[i] = new char[13];
swprintf(array[i], L"somestring_%d", i);
}
是的,您应该在使用完毕后删除分配的空间。这看起来像是:
for (int i=0; i<5; i++)
delete [] array[i];
delete [] array;
OTOH,你可能不应该这样做,而是使用类似的东西:
std::vector<std::wstring> array;
for (int i=0; i<5; i++) {
std::wostringstream temp;
temp << L"somestring_" << i;
array.push_back(temp.str());
}
在这种情况下,您可以使用array[i].str()
检索“LPWSTR”。您根本不必明确分配或释放任何内存。
答案 1 :(得分:1)
LPWSTR是MS Windows中的unicode长字符串指针,尝试使用L“”形式的字符串,如:
swprintf(wszArray [x],L“somestring_%d”,x);
Windows中的Unicode宏可通过#define UNICODE使用,在MS VS中有一个使用unicode字符串的设置,设置后,它将为您定义UNICODE。
LPWSTR与wchar_t *相同,LPSTR为char *。
在c ++中分配内存时,它应该总是免费的,所以答案是肯定的。
答案 2 :(得分:1)
实际上LPWSTR
已经是你应该做的指针
LPTSTR pBuffer; // TCHAR*
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.
然后for
循环就可以了。
对于unicode-long字符串,您需要在字符串前加上
L
就像在L"your string"
以后需要释放使用delete[]
喜欢:
delete[] pBuffer;
有关您可能希望阅读的更多文档:
http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
答案 3 :(得分:0)
学习和做一些研究和开发是不同的方面。但是你应该使用这些本地方法进行字符串处理。而是使用std::string
,stringstream
,CString
等类。
std::string
被许多人使用(不是我!),它不支持<<
运算符,也不格式化函数,但支持其他函数。stringstream
很丰富,不支持格式化函数,但是<<
运算符,它们在编译时被解析并且是类型安全的。CString
支持格式化函数和其他常见字符串功能。它不支持<<
运算符。它很好地处理ANSI / Unicode问题。如果您不使用MFC,仍然可以在非MFC项目中由#include<atlstr.h>
使用它。答案 4 :(得分:0)
我实际上也是C ++的新手(只完成Deitel c ++书,仅此而已),我只喜欢CString :-(如果我同意允许项目在项目设置中接受MFC库,我将整个库包括在内头文件如果我愿意,那么我可以做类似的事情
CString str="";
CArray<CString,CString> arr;
for(int i=0;i<n;i++)
{
str.Format("something_%d",i);
arr.Add(str);
}
如果你真的很喜欢LPWSTR,上面也适用它。 CString是一个用于处理ANSi和Unixcode的类......: - )