2012-02-22 129 views
3

我如何获得一个LPCTSTR的子?如何获取LPCTSTR的子字符串?

+3

什么是LPCTSTR? – wildplasser 2012-02-22 16:28:37

+0

你可以使用'std :: string'吗? – 2012-02-22 16:29:32

+0

从我的理解LPCTSTR有点像const char *,如果是这种情况,那么你需要做一个副本,并把一个nul终止符在索引both.find(“ - ”)... – vmpstr 2012-02-22 16:30:08

回答

4

LPCSTRchar *,它没有方法,只是花哨的名字。

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

编辑:正如Christoph指出的那样,TCHAR的类型根据是否定义UNICODE而不同。如果定义了UNICODE(请查询#ifdef UNICODE,在预处理器上执行Google搜索以了解有关诸如#define#ifdef之类的更多信息),则需要使用std::wstring而不是std::string

编辑2:比,如果你需要使用std::stringstd::wstring所有的时间检查更简单的解决办法,就是按照康拉德·鲁道夫的意见,并创建一个类似std::stringstd::wstring一个新的typedef。类似这样的:

typedef std::basic_string<TCHAR> tstring; 

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

+4

他使用'LPCTSTR',如果'UNICODE'被设置为'wchar_t *'... – Christoph 2012-02-22 16:33:09

+0

所以我需要将它复制到std :: string,获取子字符串,然后将其复制回char *? – Holtorf 2012-02-22 16:33:37

+2

@Holtorf不一定。上级解决方案根本不使用'LPCTSTR'。或者,如果必须的话,在大多数情况下你都不需要复制,因为你可以在内部简单地使用'std :: basic_string '并在需要将其传递给方法时调用它的'c_str()'方法需要一个'LPCTSTR'。 – 2012-02-22 16:39:02

1

必须复制的字符串,你不能有一个指向现有缓冲区,用在你需要它空终结,在不改变缓冲区,你不能因为它是常量(该C在LPCTSTR)。

1

如果你使用MFC,你也可以建立一个CString并用它来获得下半场。

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

还要注意,通常,如果您使用T字符串指针类型(请注意LPCTSTR中的T),您还需要使用_T()来包围字符串文字以允许使用Unicode进行构建。如果你没有构建Unicode,你将拥有它的方式将起作用,因为LPCTSTR将变成LPCSTR并使用char *而不是wchar *。 – Nerdtron 2012-02-22 16:38:58

2

这是转换成的std :: string -

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

然后使用basic_string的::找得到子分离器的位置( “ - ” 是你在编辑之前)和basic_string的::擦除擦除此位置后的字符串。与MSDN 咨询样品:basic_string Members

3

作为替代方案,作为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) ...所以可能不值得。但是,无论如何,这里将作为替代选择。

+0

在尝试设置新值之前,应该确保斜杠不为NULL。我还喜欢使用'\ 0'作为替换。 – Jason 2016-12-02 16:07:06

2

LPCTSTR是微软特定类型和代表大号P ointer到Ç onstant Ť(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; 
} 
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); 

不幸的是没有TCOUT除非你#定义它的地方:

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

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

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

注意,通常像这样的代码变得非常凌乱,并且往往会导致巨大的膨胀。

3

使用_tcsstr()找到字符串的LPCTSTR

一个LPCSTR要么一个指向ANSI字符串(“字符”)或Unicode字符串(“WCHAR”) 你不需要做任何转换为​​stl:字符串等 只是调用strstr()这是什么_tcsstr()做的适当的味道