企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# C++宽字符串相关函数 在使用visual studio 环境下编写win32 的C++程序时,或是阅读他人较早前在Visual Studio下编写的程序时,对字符串的处理的这一块总是让人头疼,网上好多的源码是ANSI字符的,直接复制过来要改写成UNICODE版本的,改成的过程中还要面对Visual Studio中定义的一大批字符串处理宏,简直让人头疼,学习起来又显得非常的杂乱,所以很有必要对这一块的内容加以整理。 在Visual Studio 下经常可以见到 \_tcsstr  lstrcat  ws char是1字节(8位),wchar\_t是2字节(windows下16位,Linux下32位) 也就是word类型;相关的操作字符串的函数如下: ~~~ wcsstr 函数原型:wchar_t *wcsstr( const wchar_t *haystack, const wchar_t *needle ); 函数功能:在一个宽字符串haystack中搜索另一个宽字符串needle,若成功则返回一个指向后者第一次出现的位置,否则返回NULL 说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。 C函数: char *strstr(const char *haystack, const char *needle) ~~~ ~~~ wcscat 函数原型:wchar_t *wcscat(wchar_t *strDestination, const wchar_t *strSource); 函数功能:把strSource所指字符串添加到strDestination结尾处,覆盖strDestination结尾处的'\0'并添加'\0'。 说明:strSource和strDestination所指内存区域不可以重叠且strDestination必须有足够的空间来容纳strSource的字符串。 返回值:返回指向strDestination的指针. No return value is reserved to indicate an error. 备注:因为wcscat在strDestination追加strSource前不进行检查,这是一个缓冲区溢出的潜在原因。故使用时应注意。推荐使用wcscat_s替代. C函数:char *strcat(char *dest, const char *src) 说明:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾 ~~~ ~~~ wcschr 函数原型:wchar_t *wcschr(wchar_t *_Str, wchar_t _Ch); 函数重载1:const wchar_t *wcschr(const wchar_t *_Str, wchar_t _Ch); 函数功能:查找字符串_Str中首次出现字符_Ch的位置 说明:返回首次出现_Ch的位置的指针,如果_Str中不存在_Ch则返回NULL C函数:char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。 ~~~ ~~~ wcscmp 函数原型:int wcscmp(const wchar_t *_Str1, const wchar_t *_Str2); 函数功能:比较字符串_Str1和_Str2 说明: 当_Str1<_Str2时,返回值<0 当_Str1=_Str2时,返回值=0 当_Str1>_Str2时,返回值>0 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。 如: "A"<"B" "a">"A" "computer">"compare" C函数:int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较 ~~~ ~~~ wcscpy 函数原型:wchar_t *wcscpy(wchar_t *_Dest, const wchar_t *_Source); 函数功能:把_Source所指由NULL结束的字符串复制到_Dest所指的数组中 说明:_Source和_Dest所指内存区域不可以重叠且_Dest必须有足够的空间来容纳_Source的字符串。 返回指向_Dest的指针 C函数:char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 ~~~ ~~~ wcscspn 函数原型:size_t wcscspn(const wchar_t *_Str, const wchar_t *_Control); 函数功能:按顺序在字符串_Str中搜寻与_Control中字符的第一个相同字符,返回这个字符在_Str中第一次出现的位置 说明:(返回第一个出现的字符在_Str中的下标值,亦即在_Str中出现而_Control中没有出现的子串的长度。) 简单地说,若wcscspn()返回的数值为n,则代表字符串_Str开头连续有n个字符都不含字符串_Control内的字符。 C函数:size_t strcspn(const char *str1, const char *str2) 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。 ~~~ ~~~ wcslen 函数原型:size_t wcslen(const wchar_t *_Str); 函数功能:计算字符串_Str的(unsigned int型)长度 说明:返回_Str的长度,不包括结束符NULL C函数: size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。 ~~~ ~~~ wcsncat 函数原型:wchar_t * wcsncat(wchar_t *_Dest, const wchar_t *_Source, size_t _Count); 函数功能:把_Source所指字符串的前n个字符添加到_Dest结尾处(覆盖_Dest结尾处的'\0')并添加'\0'。 说明:_Source和_Dest所指内存区域不可以重叠且_Dest必须有足够的空间来容纳_Source的字符串。 返回指向_Dest的指针。 C函数: char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止 ~~~ ~~~ wcsncmp 函数原型:int wcsncmp(const wchar_t *_Str1, const wchar_t *_Str2, size_t _MaxCount); 函数功能:比较字符串 说明:比较字符串_Str1和_Str2的大小,如果_Str1小于_Str2,返回值就<0,反之如果_Str1大于_Str2,返回值就>0,如果_Str1等于_Str2,返回值就=0,_MaxCount指的是_Str1与_Str2的比较的字符数。此函数功能即比较字符串_Str1和_Str2的前_MaxCount个字符。 C函数:int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。 ~~~ ~~~ wcsncpy 函数原型:wchar_t * wcsncpy(wchar_t *_Dest, const wchar_t *_Source, size_t _Count); 函数功能:将字符串_Source中最多_Count个字符复制到字符数组_Dest中(它并不像wcscpy一样遇到NULL才停止复制,而是等凑够_Count个字符才开始复制),返回指向_Dest的指针 说明:如果_Count > _Source串长度,_Dest栈空间溢出产生崩溃异常 C函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。 ~~~ ~~~ wcspbrk 函数原型:wchar_t * wcspbrk(wchar_t *_Str, const wchar_t *_Control); 函数重载1:const wchar_t * wcspbrk(const wchar_t *_Str, const wchar_t *_Control); 函数功能:在字符串_Str中寻找字符串_Control中任何一个字符相匹配的第一个字符的位置,空字符NULL不包括在内 说明:返回指向_Str中第一个相匹配的字符的指针,如果没有匹配字符则返回空指针NULL C函数: char *strpbrk(const char *str1, const char *str2) 检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。 ~~~ ~~~ wcsrchr 函数原型:wchar_t * wcsrchr(wchar_t *_Str, wchar_t *_Ch); 函数重载1:const wchar_t * wcsrchr(const wchar_t *_Str, wchar_t *_Ch); 函数功能:查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回指向该位置的指针,如果失败,则返回 false C函数:char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。 ~~~ ~~~ wcsspn 函数原型:size_t wcsspn(const wchar_t *_Str, const wchar_t *_Control); 函数功能:返回字符串中第一个在指定字符串中出现的字符下标 说明:wcsspn()从参数_Str字符串的开头计算连续的字符,而这些字符都完全是_Control所指字符串中的字符。简单的说,若wcsspn()返回的数值为n,则代表字符串_Str开头连续有n个字符都是属于字符串_Control内的字符 C函数: size_t strcspn(const char *str1, const char *str2) 检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。 ~~~ ~~~ wcstol 函数原型:long wcstol(const wchar_t *_Str, wchar_t **_EndPtr, int _Radix); 函数功能:这个函数会将参数_Str字符串根据参数_Radix来转换成长整型数。参数_Radix范围从2至36,或0。参数_Radix代表采用的进制方式,如_Radix值为10则采用10进制,若_Radix值为16则采用16进制等。当_Radix值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换、遇到'0'前置字符而不是'0x'的时候会使用8进制做转换。一开始wcstol()会扫描参数_Str字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数_EndPtr不为NULL,则会将遇到不合条件而终止的_Str中的字符指针由_EndPtr返回 ~~~ ~~~ wmemchr 函数原型:wchar_t *wmemchr(wchar_t * buf, wchar_t c,size_t count); // C++ only wchar_t *wmemchr(const wchar_t * buf, wchar_t c,size_t count); // C only C函数:void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置 ~~~ ~~~ wmemcmp 函数原型: int wmemcmp(const wchar_t * buf1,const wchar_t * buf2,size_t count); C函数: int memcmp(const void *str1, const void *str2, size_t n) 把 str1 和 str2 的前 n 个字节进行比较。 ~~~ ~~~ wmemcpy 函数原型:wchar_t *wmemcpy( wchar_t *dest, const wchar_t *src, size_t count); C函数: void *memcpy(void *dest, const void *src, size_t n) 从 src 复制 n 个字符到 dest。 ~~~ ~~~ wmemmove 函数原型:wchar_t *wmemmove(wchar_t *dest,const wchar_t *src,size_t count); C函数:void *memmove(void *dest, const void *src, size_t n) 另一个用于从 str2 复制 n 个字符到 str1 的函数。 ~~~ wmemset 函数原型:wchar\_t \*wmemset( wchar\_t \*dest, wchar\_t c, size\_t count); ~~~ C函数:void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。 ~~~ 以下这些函数一般很少用: ~~~ wchar_t *wcstok( wchar_t *strToken, const wchar_t *strDelimit ) 该函数的作用是查找由在第二个串中指定的分界符分隔开的单词。首次调用时,strToken必须指向要分解的字符串,随后调用要把strToken设成NULL;wcstok在strToken中查找包含在 ~~~ ~~~ strDelimit中的字符并用NULL('\0')来替换,直到找遍整个字符串;返回指向下一个标记串;当没有标记串时则返回空字符NULL。 ~~~ ~~~ size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count ) 该函数将宽字符串转化为窄字符串。微软另外提供的字符转换的函数有MultiByteToWideChar和WideCharToMultiByte。 ~~~ ~~~ wchar_t *_wcsdup( const wchar_t *strSource ) 该函数复制一个字符串。 ~~~ ~~~ int _wcsicmp( const wchar_t *string1, const wchar_t *string2 ) 该函数比较字符串,但不区分大小写。类似的函数还有_wcsnicmp。 ~~~ ~~~ wchar_t *_wcslwr( wchar_t *string ) 该函数将字符串转化为小写。 ~~~ ~~~ wchar_t *_wcsrev( wchar_t *string ) 该函数逆序一个字符串。 ~~~ ~~~ wchar_t *_wcsupr( wchar_t *string ) 该函数将字符串转化为大写。 ~~~