C ++ Создание простого массива LPWSTR - PullRequest
2 голосов
/ 13 августа 2011

Как нуб C ++, я не могу понять, что это правильно, хотя я знаю, что это должно быть просто: {- Мне нужно создать массив LPWSTR, а затем заполнить его уникальными строками. Идея заключалась в том, чтобы сделать что-то простое, как это:

LPWSTR *wszArray = new LPWSTR[5];

for(int x = 0; x < 5; x++)
{
    swprintf(wszArray[x], "somestring_%d", x);
}

Я знаю, что я не выделил память для LPWSTR, но после нескольких попыток мне не повезло. Также я не уверен, должен ли массив быть свободным позже, когда я закончу со строками.

Любой совет был бы великолепен.

Ответы [ 5 ]

2 голосов
/ 13 августа 2011

То, что у вас есть сейчас, это единственный указатель на указатели на широкий символ.Затем вы инициализируете это адресом массива из 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());
}

В этом случае вы можете получить«LPWSTR» с использованием array[i].str().Вам вообще не нужно выделять или освобождать какую-либо память явно.

1 голос
/ 13 августа 2011

на самом деле LPWSTR уже является указателем, вы должны сделать

LPTSTR pBuffer; // TCHAR* 
pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.

, и тогда цикл for будет в порядке.для строки в Юникоде вам нужно добавить префикс строки L, как в L"your string"

, а затем вам нужно освободить память, выделенную с помощью delete[]

, например:

delete[] pBuffer;

для дальнейшей документации вы можете прочитать:

http://www.codeproject.com/Tips/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc

1 голос
/ 13 августа 2011

LPWSTR - это указатель на длинную строку в Юникоде в MS Windows, попробуйте использовать строки с формой L "", например:

swprintf (wszArray [x], L "somestring_% d", x);

Макросы Unicode в Windows доступны с помощью #define UNICODE, в MS VS есть параметр для использования строк Unicode, если он установлен, он определит UNICODE для вас.

LPWSTR такой же, как wchar_t *, а LPSTR - это char *.

Когда выделяется память в c ++, она всегда должна быть свободной, поэтому ответ да.

0 голосов
/ 13 августа 2011

Я на самом деле также новичок в 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..: -)

0 голосов
/ 13 августа 2011

Учиться и заниматься исследованиями и разработками - это другой аспект.Но вы не должны использовать эти нативные методы для обработки строк.Вместо этого используйте классы, такие как std::string, stringstream, CString и т. Д.

  • std::string используется многими (не мной!), Он не поддерживает оператор <<,ни функции форматирования, но поддерживает другие функции.
  • stringstream богат, не поддерживает функции форматирования, но << операторы, которые разрешаются во время компиляции и являются типобезопасными.
  • CString поддерживает функции форматирования и другие обычные строковые функции.Он не поддерживает << оператор.Он хорошо справляется с проблемами ANSI / Unicode.Если вы не используете MFC, вы все еще можете использовать его #include<atlstr.h> в не-MFC проекте.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...