C语言中的字符串操作函数

原创文章,转载请注明出处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, ...)



你可能感兴趣的:(C,原创,字符编码)