Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何获取LPCTSTR的子字符串?_C++_String_Winapi - Fatal编程技术网

C++ 如何获取LPCTSTR的子字符串?

C++ 如何获取LPCTSTR的子字符串?,c++,string,winapi,C++,String,Winapi,如何获得LPCTSTR的子字符串?LPCSTR只是char*的一个别致的名称,它没有方法 如果使用,则可以使用和方法提取字符串的第一部分和第二部分 编辑:如Christoph所述,TCHAR的类型根据是否定义了UNICODE而有所不同。如果定义了UNICODE(使用#ifdef UNICODE进行检查,在预处理器上进行谷歌搜索以了解有关#define和#ifdef的更多信息),您需要使用std::wstring而不是std::string 编辑2:如果您需要一直使用std::string或std

如何获得LPCTSTR的子字符串?

LPCSTR
只是
char*
的一个别致的名称,它没有方法

如果使用,则可以使用和方法提取字符串的第一部分和第二部分

编辑:如Christoph所述,
TCHAR
的类型根据是否定义了
UNICODE
而有所不同。如果定义了
UNICODE
(使用
#ifdef UNICODE
进行检查,在预处理器上进行谷歌搜索以了解有关
#define
#ifdef
的更多信息),您需要使用
std::wstring
而不是
std::string

编辑2:如果您需要一直使用
std::string
std::wstring
,一个比检查更简单的解决方案是遵循康拉德·鲁道夫的建议,创建一个类似于
std::string
std::wstring
的新类型定义。大概是这样的:

typedef std::basic_string<TCHAR> tstring;
#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 tstring;

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

您必须复制该字符串,您不能在不更改缓冲区的情况下拥有指向现有缓冲区的指针,在需要它的地方使用空终止符,因为它是常量(LPCTSTR中的C)。

如果您使用MFC,您还可以构造一个CString并使用它来获取后半部分

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

这是要转换为std::string-

LPCTSTR astring ="A random string";
std::string temp = astring;
然后使用basic_string::find获取子字符串分隔符的位置(“-”在编辑之前),并使用basic_string::erase删除此位置后的字符串。
请向MSDN咨询示例:

作为替代方案,由于LPCTSTR是一个TCHAR*,那么根据您的用例,您可以使用
\u 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是常量!在这种情况下,您需要执行
\u stprintf(复制,“%s”,exepath)
。。。所以可能不值得。但无论如何,这里将保留此选项作为替代。

LPCTSTR
是Microsoft特定的类型,代表指向常量T(Unicode)字符串的长指针。换句话说,它是
const TCHAR*
,其中
TCHAR
是泛型字符(在
WinNT.h
中定义):

其中,
WCHAR
是:

typedef wchar_t WCHAR 
所以,
LPCTSTR
是指针,除非您想使用指针、计算字节数和搜索零终止字符,否则您不能对它所表示的字符串做太多操作。最好使用一些字符串抽象(类),比如MFC或ATL<代码> Cstring < /COD>,或者STL字符串->代码> STD::String ,这更好,因为您不依赖于MFC/ATL,而只是标准C++库。一个问题是STL具有基于窄字符和宽字符的字符串:
std::string
std::wstring
。由于您的代码是为
UNICODE
编写的,因此可以执行以下操作:

typedef std::basic_string<TCHAR> tstring;
#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;
}
#包括
#ifdef UNICODE
typedef std::wstring tstring;
#否则
typedef std::string tstring;
#恩迪夫
int main()
{
//ANSI“te st”或L“te st”,如果是UNICODE
TCHAR pszStr[]=文本(“te st”);
//常量字符*或常量wchar\u t*(如果是UNICODE)
LPCTSTR pStr=pszStr;
tstring-str(pStr);
tstringsub1=str.substr(str.find(TEXT(“-”))+1);
tstring sub2=str.substr(0,str.length()-sub1.length()-1);
//sub1包含“st”(如果是UNICODE,则为L“st”),sub2包含“te”(如果是UNICODE,则为L“te”)
返回0;
}

利用字符串本身实际上是模板这一事实

typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;
不幸的是,除非您在某个地方定义它,否则没有tcout:

 #ifdef _UNICODE
 #define tcout wcout
 #else
 #define tcout cout
 #endif
现在我可以打印我的字符串了

 tcout << sub << static_cast<TCHAR>('\n');
t输出使用_tcssr()在LPCTSTR中查找子字符串

LPCSTR是指向ANSI字符串(“char”)或unicode字符串(“wchar”)的指针 您不需要对stl:string等进行任何转换。
只要调用strstr()的适当风格,这就是_tcsstr()所做的

据我所知,LPCTSTR有点像const char*,如果是这种情况,那么您需要制作一个副本,并在两个索引处都放置一个nul终止符。find(“-”)。@wildplasser这是Windows定义的字符串类型。这些字母表示以下IIRC。L-long,P-pointer,C-const,T-表示字符或wchar,具体取决于Unicode设置STR-string。因此,它是一种字符串指针类型,名称中包含大量信息。根据编译选项的不同,它可以是
const char*
const wchar\u t*
。您不应该使用纯字符串文本初始化
LPCTSTR
,您需要使用
\u t()
(或
TEXT()
)宏,因为
T
字符串和字符类型可能是宽字符…您使用哪种语言?C还是C++?请挑一个。你所说的LPCTSTR是什么意思?我所知道的
LPCTSTR
没有方法。因此我需要将其复制到std::string,获取子字符串,然后将其复制回char*?@Holtorf,这不一定。更好的解决方案是根本不使用
LPCTSTR
。或者,如果必须,在大多数情况下仍然不需要复制,因为只要在内部使用
std::basic_string
并调用其
c_str()
方法,只要您需要将其传递给需要
LPCTSTR
@Holtorf的方法(如果您确实需要字符指针),您可以使用该方法。我同意不使用LPCTSTR是最好的选择,但在我有机会重新编写我正在使用的旧代码之前,是否有好的解决方法?@Holtorf:。但是,认真地说,在任何地方都可以转换为
std::string
。还要注意,通常,如果您使用的是T字符串指针类型(请注意LPCTSTR中的T),那么您还需要将字符串文本用_T()包围,以允许在Unicode中构建。如果您不构建Unicode,那么它的使用方法将起作用,因为LPCTSTR将变成LPCSTR并使用char*而不是wchar*。应该确保斜杠不是N