我如何获得一个LPCTSTR的子?如何获取LPCTSTR的子字符串?
回答
LPCSTR
是char *
,它没有方法,只是花哨的名字。
如果您使用std::string
,则可以使用find
和substr
方法来提取字符串的第一部分和第二部分。
编辑:正如Christoph指出的那样,TCHAR
的类型根据是否定义UNICODE
而不同。如果定义了UNICODE
(请查询#ifdef UNICODE
,在预处理器上执行Google搜索以了解有关诸如#define
和#ifdef
之类的更多信息),则需要使用std::wstring
而不是std::string
。
编辑2:比,如果你需要使用std::string
或std::wstring
所有的时间检查更简单的解决办法,就是按照康拉德·鲁道夫的意见,并创建一个类似std::string
和std::wstring
一个新的typedef。类似这样的:
typedef std::basic_string<TCHAR> tstring;
然后在内部使用该字符串类型。
他使用'LPCTSTR',如果'UNICODE'被设置为'wchar_t *'... – Christoph 2012-02-22 16:33:09
所以我需要将它复制到std :: string,获取子字符串,然后将其复制回char *? – Holtorf 2012-02-22 16:33:37
@Holtorf不一定。上级解决方案根本不使用'LPCTSTR'。或者,如果必须的话,在大多数情况下你都不需要复制,因为你可以在内部简单地使用'std :: basic_string
必须复制的字符串,你不能有一个指向现有缓冲区,用在你需要它空终结,在不改变缓冲区,你不能因为它是常量(该C在LPCTSTR)。
如果你使用MFC,你也可以建立一个CString并用它来获得下半场。
LPCTSTR both = "first-second";
CString bothStr(both);
CString second_half = bothStr.Right(bothStr.GetLength() -
(bothStr.Find("-") + 1));
还要注意,通常,如果您使用T字符串指针类型(请注意LPCTSTR中的T),您还需要使用_T()来包围字符串文字以允许使用Unicode进行构建。如果你没有构建Unicode,你将拥有它的方式将起作用,因为LPCTSTR将变成LPCSTR并使用char *而不是wchar *。 – Nerdtron 2012-02-22 16:38:58
这是转换成的std :: string -
LPCTSTR astring ="A random string";
std::string temp = astring;
然后使用basic_string的::找得到子分离器的位置( “ - ” 是你在编辑之前)和basic_string的::擦除擦除此位置后的字符串。与MSDN 咨询样品:basic_string Members
作为替代方案,作为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)
...所以可能不值得。但是,无论如何,这里将作为替代选择。
在尝试设置新值之前,应该确保斜杠不为NULL。我还喜欢使用'\ 0'作为替换。 – Jason 2016-12-02 16:07:06
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::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;
}
利用的事实,串实际上是一种模板本身。
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');
注意,通常像这样的代码变得非常凌乱,并且往往会导致巨大的膨胀。
使用_tcsstr()找到字符串的LPCTSTR
一个LPCSTR要么一个指向ANSI字符串(“字符”)或Unicode字符串(“WCHAR”) 你不需要做任何转换为stl:字符串等 只是调用strstr()这是什么_tcsstr()做的适当的味道
- 1. 字符串到LPCTSTR
- 2. 如何将LPCSTR字符串转换为LPCTSTR字符串?
- 3. 字符串串连的char *与LPCTSTR
- 4. 如何从ColdFusion中的字符串获取子字符串
- 5. 如何获取Unicode字符串的Ruby子字符串?
- 6. 如何从给定的字符串获取子字符串?
- 7. 从字符串获取子字符串__
- 8. 如何获取子字符串
- 9. django:如何获取子字符串?
- 10. 我如何获取子字符串?
- 11. 如何通过PHP从字符串获取子字符串?
- 12. MySQL - 如何从字符串中获取子字符串表
- 13. 如何从字符串中获取子字符串?
- 14. 通过搜索字符串获取子字符串文本来获取字符串的子字符串?
- 15. KDB获取子字符串
- 16. 如何获取字符分隔的子字符串?
- 17. 获取子串给定的字符串
- 18. strcmp比较LPCTSTR和字符串
- 19. 如何获取包含来自C中字符串的字的子字符串?
- 20. 如何从字符串使用PHP获取特定的子字符串数字?
- 21. 如何从c#中的字符串获取子串?
- 22. PHP从字符串获取子串
- 23. 从字符串获取子串C
- 24. 如何获得的子字符串中
- 25. 如何从特定字符后的字符开始获取子字符串?
- 26. 获取子字符串的索引
- 27. 获取给定字符串的子字符串
- 28. 获取字符串中的最后一个子字符串?
- 29. 在JavaScript中获取字符串的所有子字符串
- 30. 获取字符串的特定子字符串
什么是LPCTSTR? – wildplasser 2012-02-22 16:28:37
你可以使用'std :: string'吗? – 2012-02-22 16:29:32
从我的理解LPCTSTR有点像const char *,如果是这种情况,那么你需要做一个副本,并把一个nul终止符在索引both.find(“ - ”)... – vmpstr 2012-02-22 16:30:08