С++ _TCHAR szTestString[] Как присвоить значение строки

Вот так работает _TCHAR szTestString[] = _T("132.423.432:8181"); А как присвоить string, пишет ошибку "для агрегатного объекта требуется инициализация с использованием {...}"


Ответы (2 шт):

Автор решения: AndryS1

Если вам нужно из _TCHAR в std::string, тогда как-то так

    _TCHAR tstr[] = _T("132.423.432:8181");
    std::string str(tstr, tstr + sizeof(tstr) / sizeof(TCHAR));

Если вам нужно "132.423.432:8181" в std::string, тогда так

    std::string str("132.423.432:8181");
→ Ссылка
Автор решения: Georgy Firsov

В зависимости от настроек использования Юникода в проекте запись

_TCHAR szTestString[] = _T("132.423.432:8181");

разворачивается препроцессором в

char szTestString[] = "132.423.432:8181";     // без Unicode
wchar_t szTestString[] = L"132.423.432:8181"; // c Unicode

Если уже имеется объект std::string или std::wstring, то поступить можно двумя способами:

  • Получить указатель на низлежащую строку, вызвав метод c_str()
  • Скопировать содержимое строчки в массив на стеке, если вдруг он позарез нужен:
char szTestString[18] = { 0 };
strcpy_s(szTestString, sMyStdString.c_str());

// или

wchar_t szTestString[18] = { 0 };
wcscpy_s(szTestString, sMyStdWstring.c_str());

Если же нужно попросту инициализировать строку, то никто не мешает сделать так:

std::string str = "132.423.432:8181";
std::wstring wstr = L"132.423.432:8181";

Ну либо так:

#ifdef UNICODE // возможно _UNICODE
#   define tstring wstring
#else
#   define tstring string
#endif

// ...

std::tstring str = _T("132.423.432:8181");

PS: по поводу std::string везде и всюду - в программировании под Windows - не самая лучшая практика. Как минимум по причине повсеместного использования юникода в винде - тогда уж std::wstring лучше, но и тут есть свой минус - std::basic_string - штука довольно медленная (по крайней мере в реализации STL от Microsoft, поэтому если важна производительность, то лучше оперировать голыми строчками. Однако, если производительность не сильно важна, то можно и их использовать, но надо помнить, что WinAPI - штука сишная, там нужно часть будет звать методы c_str() и data(), а также помнить, что при изменении размера строки адрес внутренней сишной строчки меняется и инвалидирует полученные ранее указатели на неё.

→ Ссылка