如何获取LPCTSTR的子字符串?

时间:2012-02-22 16:25:38

标签: c++ string winapi

如何获取LPCTSTR的子字符串?

8 个答案:

答案 0 :(得分:4)

LPCSTR只是char *的奇特名称,它没有方法。

如果您使用std::string,则可以使用findsubstr方法提取字符串的第一部分和第二部分。

编辑如Christoph所述,TCHAR的类型会有所不同,具体取决于是否定义UNICODE。如果定义了UNICODE(请与#ifdef UNICODE一起检查,请在预处理器上进行Google搜索,以了解有关#define#ifdef等内容的更多信息),std::wstring而不是std::string

编辑2:比检查您是否需要始终使用std::stringstd::wstring更简单的解决方案是遵循Konrad Rudolph的建议并创建一个新的typedef类似于std::stringstd::wstring。像这样:

typedef std::basic_string<TCHAR> tstring;

然后在内部使用该字符串类型。

答案 1 :(得分:4)

作为替代方案,由于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弦乐队感到舒适,可能会更容易。

编辑:忘了LPCTSTR是一个const!在这种情况下你需要做_stprintf(copy,"%s",exepath) ......所以可能不值得。但无论如何,这将留在这里作为替代。

答案 2 :(得分:3)

利用字符串本身就是模板的事实。

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

然后使用     tstring str(_T(“Hello world”));

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

不幸的是,除非你在某个地方#define,否则没有tcout:

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

现在我可以打印我的字符串

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

请注意,通常这样的代码会非常混乱,并且经常会导致巨大的膨胀。

答案 3 :(得分:3)

使用_tcsstr()在LPCTSTR

中查找子字符串

LPCSTR是指向ANSI字符串('char')或unicode字符串('wchar')的指针 你不需要转换为stl:string等。 只需调用适当的strstr()风格,这就是_tcsstr()所做的事情

答案 4 :(得分:2)

这是转换为std :: string -

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

然后使用basic_string :: find获取子串分隔符的位置(“ - ”在编辑之前)和basic_string :: erase在此位置之后擦除字符串。 有关样本,请咨询MSDN:basic_string Members

答案 5 :(得分:2)

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字符串 - std::string这更好,因为你不依赖于MFC / ATL而只是标准的C ++库。一个问题是STL具有基于窄字符和宽字符的字符串:std::stringstd::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;
}

答案 6 :(得分:1)

你必须复制字符串,你不能有一个指向现有缓冲区的指针,你需要它的null终止符,而不需要更改缓冲区,你不能这样做因为它是const(LPCTSTR中的C)。

答案 7 :(得分:1)

如果你正在使用MFC,你也可以构造一个CString并使用它来获得下半部分。

LPCTSTR both = "first-second";
CString bothStr(both);
CString second_half = bothStr.Right(bothStr.GetLength() -
   (bothStr.Find("-") + 1));