Как я могу получить подстроку LPCTSTR? - PullRequest
3 голосов
/ 22 февраля 2012

Как получить подстроку LPCTSTR?

Ответы [ 8 ]

4 голосов
/ 22 февраля 2012

В качестве альтернативы, поскольку LPCTSTR - это TCHAR *, вы можете довольно просто «подстроку» использовать _tcschr ... в зависимости от вашего варианта использования.

TCHAR* exepath = getTheFullPathToThisProcess();
TCHAR* extension = _tcschr(exepath,'.'); //extension is a valid c-string containing '.exe'
//where is the last "\"?
TCHAR* slash = _tcsrchr(exepath,'\\');
*slash = 0;//exepath is now shortened to the path pre the filename of this process.

Может быть проще дляВы, если вы чувствуете себя комфортно в стране c-string.

РЕДАКТИРОВАТЬ: Забыл, что LPCTSTR является const!Вам нужно будет сделать _stprintf(copy,"%s",exepath) в этом случае ... так что, возможно, оно того не стоит.Но все равно оставлю это здесь как альтернативу.

4 голосов
/ 22 февраля 2012

LPCSTR - просто причудливое имя для char *, у него нет методов.

Если вы используете std::string, вы можете использовать find и substr методы для извлечения первой и второй части строки.

Редактировать: Как отметил Кристоф, тип TCHARотличается в зависимости от того, определено UNICODE или нет.Если определено UNICODE (проверьте с помощью #ifdef UNICODE, выполните поиск в Google на препроцессоре, чтобы узнать больше о таких вещах, как #define и #ifdef), вам нужно использовать std::wstring вместо std::string.

Редактировать 2: Более простое решение, чем проверка, нужно ли вам постоянно использовать std::string или std::wstring, состоит в том, чтобы следовать совету Конрада Рудольфа и создать новый typedef, похожий на std::stringи std::wstring.Примерно так:

typedef std::basic_string<TCHAR> tstring;

А затем использовать этот тип строки для внутреннего использования.

3 голосов
/ 23 февраля 2012

используйте _tcsstr (), чтобы найти подстроку в LPCTSTR

LPCSTR - это либо указатель на строку ANSI ('char'), либо строка в кодировке Unicode ('wchar') вам не нужно делать какие-либо преобразования в stl: string и т. д. просто вызовите соответствующий вариант strstr (), что _tcsstr () делает

3 голосов
/ 22 февраля 2012

Используйте тот факт, что строка на самом деле является шаблоном.

typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;

Затем используйте tstring str (_T ("Hello world"));

tstring sub = str.substr(6, 3 );

К сожалению, нетэто не tcout, если вы не #define это где-то:

 #ifdef _UNICODE
 #define tcout wcout
 #else
 #define tcout cout
 #endif

Теперь я могу напечатать свою строку

 tcout << sub << static_cast<TCHAR>('\n');

Обратите внимание, что в общем коде, как это становится очень грязным, и часто приводит когромный вздор.

2 голосов
/ 22 февраля 2012

LPCTSTR является специфическим типом Microsoft и означает L ong P ointer to C onstant T (Unicode) STR ING.Другими словами, это const TCHAR*, где TCHAR - это общий символ (определенный в WinNT.h):

#ifdef UNICODE
   typedef WCHAR TCHAR
#else
   typedef char TCHAR
#endif

, где WCHAR:

typedef wchar_t WCHAR 

Итак,LPCTSTR - это указатель, и вы не можете многое сделать со строкой, которую он представляет, если только вы не хотите играть с указателями, считать байты и искать символ нулевого завершения.Лучше использовать некоторые из строковых абстракций (классов), таких как MFC или ATL CString или STL string - std::string, что лучше, поскольку вы не зависите от MFC / ATL, а просто от стандартной библиотеки C ++.Один улов заключается в том, что в STL есть строка, основанная на узких и широких символах: std::string и std::wstring.Поскольку ваш код написан для UNICODE, вы можете сделать что-то вроде этого:

#include <string>

#ifdef UNICODE
    typedef std::wstring tstring;           
#else
    typedef std::string tstring;
#endif

int main()
{
    // ANSI "te-st" or L"te-st" if UNICODE
    TCHAR pszStr[] = TEXT("te-st");

    // const char* or const wchar_t* if UNICODE
    LPCTSTR pStr = pszStr;

    tstring str(pStr);

    tstring sub1 =  str.substr(str.find(TEXT("-")) + 1);
    tstring sub2 =  str.substr(0, str.length() - sub1.length() - 1);        

    // sub1 contains "st" (L"st" if UNICODE) and sub2 contains "te" (L"te" if UNICODE)

    return 0;
}
2 голосов
/ 22 февраля 2012

Это для преобразования в std :: string -

LPCTSTR astring ="A random string";
std::string temp = astring;

Затем используйте basic_string :: find для получения позиции разделителя подстрок («-» было до вашего редактирования) и basic_string :: erase для стиранияСтрока после этой позиции.Проконсультируйтесь с MSDN для образцов: члены Basic_string

1 голос
/ 22 февраля 2012

Если вы используете MFC, вы также можете создать CString и использовать ее для получения второй половины.

LPCTSTR both = "first-second";
CString bothStr(both);
CString second_half = bothStr.Right(bothStr.GetLength() -
   (bothStr.Find("-") + 1));
1 голос
/ 22 февраля 2012

Вы должны скопировать строку, у вас не может быть указателя на существующий буфер, с нулевым терминатором, где он вам нужен, без изменения буфера, который вы не можете, потому что это const (C в LPCTSTR).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...