如何获取LPCTSTR的子字符串?
答案 0 :(得分:4)
LPCSTR
只是char *
的奇特名称,它没有方法。
如果您使用std::string
,则可以使用find
和substr
方法提取字符串的第一部分和第二部分。
编辑如Christoph所述,TCHAR
的类型会有所不同,具体取决于是否定义UNICODE
。如果定义了UNICODE
(请与#ifdef UNICODE
一起检查,请在预处理器上进行Google搜索,以了解有关#define
和#ifdef
等内容的更多信息),std::wstring
而不是std::string
。
编辑2:比检查您是否需要始终使用std::string
或std::wstring
更简单的解决方案是遵循Konrad Rudolph的建议并创建一个新的typedef类似于std::string
和std::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::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;
}
答案 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));