Проблема с областью использования памяти: Сброс значения переменной, Как присвоить значение LPCWSTR?

Я начинающий программист cpp. Я конвертирую строковое значение в LPCWSTR. Когда я пытаюсь получить доступ к этому значению, он дает нулевое значение. Пожалуйста, проверьте этот код прилагается ниже. Я думаю, что это из-за того, что эталонное значение памяти очищается после области видимости переменной.

std::wstring string2wString(const std::string& s)
{
int len;
int slength = (int)s.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
}

void main(){
string str1,str2,str3;
wstring wStr1;
LPCWSTR lpStr1[MAX_PATH];
int index=0;
for(int i=0;i<iLimit;i++)
{
str1="String 1";
//do operations
for(int j=0;j<jLimit;j++)
{
// do operations
str2=" String 2";
str3= str1+str2;
wStr1= string2wString(str3); //converting to wstring
lpStr1[index]=wStr1.c_str();
index++
}
}
cout << lpStr1[0] << endl;
}

Пожалуйста, помогите мне решить эту проблему.

0

Решение

Указатель возвращается wStr1.c_str() может стать недействительным, когда wStr1 позже модифицируется.

Лучшее решение — придерживаться типов C ++:

std::wstring strings[MAX_PATH];

// ...
MultiByteToWideChar(CP_ACP, 0, str3.c_str(), slength, buf, len);
strings[index] = buf;
delete[] buf;
// ...

или вы можете отложить удаление буфера и просто использовать его в своем массиве:

LPCWSTR lpStr1[MAX_PATH];
// ...
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, str3.c_str(), slength, buf, len);
lpStr1[index] = buf;
1

Другие решения

Здесь есть несколько проблем:

  • LPCWSTR lpStr1[MAX_PATH]; определяет массив указателей на const wchar_t, а не массив const wchar_t как вы, без сомнения, намерены.
  • lpStr1[index]=wStr1.c_str(); хранит указатель на временный буфер вернулся c_str(), Это не копирует строку в lpStr[index],
  • Я не уверен, что такое iLimit и jLimit, но я не вижу, что эти циклы намереваются выполнить, если вы действительно хотите преобразовать строковое значение в массив широких символов.
0

Я бы предложил использовать следующую процедуру для преобразования UNICODE:

wstring AsciiToUtf16(const string & str)
{
if (str.empty())
return wstring();

size_t charsNeeded = ::MultiByteToWideChar(CP_ACP, 0,
str.data(), (int)str.size(), NULL, 0);
if (charsNeeded == 0)
throw runtime_error("Failed converting ASCII string to UTF-16");

vector<wchar_t> buffer(charsNeeded);
int charsConverted = ::MultiByteToWideChar(CP_ACP, 0,
str.data(), (int)str.size(), &buffer[0], buffer.size());
if (charsConverted == 0)
throw runtime_error("Failed converting ASCII string to UTF-16");

return wstring(&buffer[0], charsConverted);
}
0

Почему бы не следовать этому:

C ++ Преобразование строки (или char *) в wstring (или wchar_t *)

и совсем забыли LPCWSTR?

0
По вопросам рекламы [email protected]