原创文章,转载请注明出处https://blog.csdn.net/aaron_lyn1985/article/details/80048369
简单记录C语言对字符串的操作函数,难点在于字符串结束符的处理和宽字符串的处理
C++也使用char, wchar_t表示字符型和宽字符型
本地为中文操作系统
处理多字节字符串:
处理字符串的函数基本都在
char *pMultiChar = "这是ANSI字符串";
size_t strlen(const char *s1)
int nLen = strlen(pMultiChar); //nLen为14,不包括字符串结束符0;在ANSI编码下,每个中文占两个字节
函数行为:返回从pMultiChar到结束符0的字节数,不包括结束符0;
行为备注:strlen会从pMultiChar一直遍历直到出现0
注意事项:使用者要保证pMultiChar以0结束;不要应用于Unicode字符串,里面0多,返回结果不正确,Unicode串用wcslen
char *strcpy(char *sDest, const char *sSrc)
char *pCopyBuffer = new char[strlen(pMultiChar) + 1];
strcpy(pCopyBuffer , pMultiChar);
函数行为:strcpy把第二个参数的内容拷贝到第一个参数的地址去,直到遇到结束符0,拷贝0,然后结束
行为备注:strcpy不管pCopyBuffer是否分配了足够的空间,会一直拷贝直到遇到pMultiChar的结束符0,然后拷贝0,结束
正确调用:使用者要保证pMultiChar要正确的以0结束,否则函数会一直拷贝直到遇到0;同时要保证pCopyBuffer有足够的空间存储pMultiChar,包括结束符0,否则会越界拷贝(直到拷贝完结束符0)
异常备注:如果pCopyBuffer分配的空间比strlen(pMultiChar)+1大,strcpy拷贝完后也不管剩下的部分。
char *strncpy(char *sDest, const char *sSrc, size_t copySize)
char *pNCopyBuffer = new char[strlen(pMultiChar)];
strncpy(pNCopyBuffer, pMultiChar, strlen(pMultiChar) - 1); //没有拷贝最后一个字节
*(pNCopyBuffer + strlen(pMultiChar) - 1) = 0; //末尾加结束符0
函数行为:strncpy拷贝copySize个字节到sDest
行为备注:从sSrc开始,无论如何都会拷贝copySize个字节!
正确调用:pNCopyBuffer分配的长度要包括结束符0,比如想拷贝5个字节,则分配6个字节,最后手动加0;copySize不要超过sDest分配的长度-1
异常备注:sSrc的长度和copySize之间的关系不重要,因为如果copySize大于要拷贝的字符串长度,则结束符0后面用0补齐,如果copySize小,则只拷贝copySize个字节;关键在于sDest分配的长度和copySize的关系,如果sDest空间比copySize大,则拷贝完copySize个字节后,剩下的空间不动,如果sDest分配的空间没有copySize大,拷贝会越界;注意sDest分配的空间至少比copySize大1,用来添加结束符0
int strcmp(const char *s1, const char *s2)
函数行为:比较字符串s1和s2的大小。如果s1大,返回正数(1);相等,返回0;s1小,返回负数(-1)
void *menset(void *s1, int val, size_t size)
函数行为:把从s1开始的size个字节置为val。如果size比s1分配的空间大,则会越界操作,所以注意size值不要超过s1分配的大小
int printf(const char * format, ...)
处理宽字符串
wchar_t定义在
L宏定义可以把字符串表示为宽字符和宽字符串
wchar_t *pWideChar = L"这是Unicode字符串";
size_t wcslen(const wchar_t *s1)
int nLen = wcslen(pWideChar); //nLen为12 表示字符数,不包括结束符00
函数行为:返回从pWideChar到结束符00的字符数,不包括结束符00;遇到单个0不会结束
行为备注:由于Unicode编码使用双字节表示字符,所以可以算出字符数;strlen无法算出字符数,只能算出字节数,因为多字节编码使用一个或两个字节表示一个字符
正确调用:保证s1是Unicode字符串;并以00结束
wchar_t *wcscpy(wchar_t *sDest, const wchar_t *sSrc)
wchar_t *pWideBuffer = new wchar_t[wcslen(pWideChar) + 1];
wcscpy(pWideBuffer, pWideChar);
函数行为:与strcpy类似,把sSrc按字符拷贝到sDest,直到遇到结束符00,拷贝00,结束
行为备注:wcscpy不管sDest是否分配了足够的空间;动态分配数组的中括号里填的是字符数
正确调用:sSrc要以00结尾;sDest要分配足够装下sSrc及结束符00的空间
wchar_t *wcsncpy(wchar_t *sDest, const wchar_t *sSrc, size_t copySize)
wchar_t *pWideBuffer = new wchar_t[wcslen(pWideChar) + 1];
wcsncpy(pWideBuffer, pWideChar, wcslen(pWideChar));
*(pWideBuffer + wcslen(pWideChar)) = 0;
函数行为与strncpy相似,注意copySize为字符数;结束符为00;指针每次移动2个字节;赋值=0把该字符(两个字节)置0
int wcscmp(const wchar_t *s1, const wchar_t *s2)
函数行为:比较字符串s1和s2的大小。如果s1大,返回正数(1);相等,返回0;s1小,返回负数(-1)
void *wmemset(wchar_t *s1, wchar_t val, size_t size)
函数行为:把从s1开始的size个字符置为val。如果size比s1分配的空间大,则会越界操作,所以注意size值不要超过s1分配的大小;val是wchar_t类型,如3,L'汉',‘A’等
int wprintf(const wchar_t *format, ...)