Reputation: 1580
As a C++ noob, I can't seem to get this right even though I know it should be simple :{ - I need to create an array of LPWSTR and then populate it with unique strings. The idea was to do something simple like this:
LPWSTR *wszArray = new LPWSTR[5];
for(int x = 0; x < 5; x++)
{
swprintf(wszArray[x], "somestring_%d", x);
}
I know that I haven't allocated memory for the LPWSTR, but after trying a few things I am not having much luck. Also I'm not sure if the array should be free'd later once i'm done with the strings.
Any advice would be great.
Upvotes: 2
Views: 10871
Reputation: 490808
What you have right now is a single pointer to pointers to wide char. You're then initializing that with the address of an array of 5 dynamically allocated pointers to wide char's. That's fine as far as it goes, but does not allocate any space for the strings themselves, only for pointers to 5 strings. You then need to allocate space for the strings themselves:
for (int i=0; i<5; i++) {
array[i] = new char[13];
swprintf(array[i], L"somestring_%d", i);
}
Yes, you should delete the space you allocated after you're done using it. That would look something like:
for (int i=0; i<5; i++)
delete [] array[i];
delete [] array;
OTOH, you probably shouldn't do any of this, and instead use something like:
std::vector<std::wstring> array;
for (int i=0; i<5; i++) {
std::wostringstream temp;
temp << L"somestring_" << i;
array.push_back(temp.str());
}
In this case, you can retrieve a "LPWSTR" using array[i].c_str()
. You don't have to allocate or free any of the memory explicitly at all though.
Upvotes: 3
Reputation: 53
I am actually also new in C++ (only finish Deitel c++ book, nothing more), I like CString only :-( if I agree to allow the project to accept MFC library in the project settings, I include the whole library in the header file if I feel like to, then I can do something like
CString str="";
CArray<CString,CString> arr;
for(int i=0;i<n;i++)
{
str.Format("something_%d",i);
arr.Add(str);
}
If you really really love LPWSTR, the above also works with it. CString is a class designed to handle ANSi and Unixcode... :-)
Upvotes: 0
Reputation: 18461
Learning and doing some research-and-development is different aspect. But you shoulnt use these native methods for string processing. Instead use classes like std::string
, stringstream
, CString
etc.
std::string
is used by many (NOT by me!), it doesn't support <<
operator, nor formatting functions, but supports other functions.stringstream
is rich, doesn't support formatting functions, but <<
operators, which are resolved at compile time and are type-safe.CString
supports formatting functions, and other common string functionality. It doesn't support <<
operator. It handles ANSI/Unicode issues quite well. If you arent using MFC, you still can use it by #include<atlstr.h>
in non-MFC project.Upvotes: 0
Reputation: 38260
actually LPWSTR
is already a pointer you should rather do
LPTSTR pBuffer; // TCHAR*
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.
and then the for
loop will be fine.
for unicode-long string you need to prefix the string with
L
like in L"your string"
and later you need to free the memory allocated using delete[]
like :
delete[] pBuffer;
for further documentation you may like to read:
http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
Upvotes: 2
Reputation: 11
LPWSTR is a unicode long string pointer in MS Windows, try using strings with the L"" form such as:
swprintf(wszArray[x], L"somestring_%d", x);
Unicode macros in Windows are available by using #define UNICODE, in MS VS there is a setting to use unicode strings, when set, it will define UNICODE for you.
LPWSTR is the same as wchar_t* and LPSTR is char*.
When allocate memory in c++, it should always be free'd, so the answer is Yes.
Upvotes: 1