目录
一、长度不受限制的字符串函数
1.strlen函数
2.strcpy函数
3.strcat函数
4.strcmp函数
二、 长度受限制的字符串函数
1.strncpy函数
2.strncat函数
3.strncmp函数
三、其他字符串函数
1.strstr函数
2.strtok函数
四、内存操作函数
1.memcpy函数
2.memmove 函数
3.memcmp函数
4.memset函数
五、库函数的模拟实现
1.模拟实现strlen函数
①递归实现
②计数器实现
③指针 - 指针
2.模拟实现strcpy函数
3.模拟实现strcat函数
4.模拟实现strcmp函数
5.模拟实现strncpy函数
6.模拟实现strncat函数
7.模拟实现strncmp函数
8.模拟实现strstr函数
9.模拟实现memcpy函数
10.模拟实现memmove函数
11.模拟实现memcmp函数
12.模拟实现memset函数
六、总结
一、长度不受限制的字符串函数 1.strlen函数 字符串以‘’作为结束标志,strlen函数返回的是字符串前面出现的字符个数
函数原型:size_t strlen( const char *string );
头 文 件 :
函数功能:计算字符串的长度;
注意事项:1.定义的字符串必须要包含''
char arr1[] = "abcd";char arr2[] = { 'a', 'b', 'c', 'd' };
字符串以‘’作为结束标志,strlen函数返回的是字符串前面出现的字符个数
函数原型:size_t strlen( const char *string );
头 文 件 :
函数功能:计算字符串的长度;
注意事项:1.定义的字符串必须要包含''
char arr1[] = "abcd";char arr2[] = { 'a', 'b', 'c', 'd' };
举例:
#include
2.strcpy函数 函数原型:char *strcpy( char *strDestination, const char *strSource );
头 文 件 :
函数功能:字符串拷贝;它是连同''一起拷贝过去;
参数解读:
1.char *strDestination --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.拷贝时源字符串中一定要包含;
2.拷贝时目标空间要足够大,保证放的下要拷贝过去的字符串;
3.拷贝时目标空间必须可修改(不能被const修饰);
函数原型:char *strcpy( char *strDestination, const char *strSource );
头 文 件 :
函数功能:字符串拷贝;它是连同''一起拷贝过去;
参数解读:
1.char *strDestination --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.拷贝时源字符串中一定要包含;
2.拷贝时目标空间要足够大,保证放的下要拷贝过去的字符串;
3.拷贝时目标空间必须可修改(不能被const修饰);
举例:
#include
3.strcat函数 函数原型:char *strcat( char *strDestination, const char *strSource );
头 文 件 :
函数功能:字符串连接(追加):它是连同''一起追加过去;
参数解读:
1.char *strDestination --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.追加时源字符串中一定要包含
2.追加时目标空间要足够大,保证放的下要追加过去的字符串
3.追加时目标空间必须可修改(不能被const修饰)
4.自己不能给自己追加(需要使用strncat)
函数原型:char *strcat( char *strDestination, const char *strSource );
头 文 件 :
函数功能:字符串连接(追加):它是连同''一起追加过去;
参数解读:
1.char *strDestination --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.追加时源字符串中一定要包含
2.追加时目标空间要足够大,保证放的下要追加过去的字符串
3.追加时目标空间必须可修改(不能被const修饰)
4.自己不能给自己追加(需要使用strncat)
举例:
#include
4.strcmp函数 函数原型:int strcmp( const char *string1, const char *string2 );
头 文 件 :
函数功能:字符串比较:比较的是ASSIC码值;比较的是内容而不是长度;
参数解读:
1.string1 --- 被比较的字符串;
2.string2 --- 待比较的字符串;
比较方法:
1.当 str1 < str2 返回负数
2.当 str1 = str2 返回0
3.当 str1 > str2 返回正数
函数原型:int strcmp( const char *string1, const char *string2 );
头 文 件 :
函数功能:字符串比较:比较的是ASSIC码值;比较的是内容而不是长度;
参数解读:
1.string1 --- 被比较的字符串;
2.string2 --- 待比较的字符串;
比较方法:
1.当 str1 < str2 返回负数
2.当 str1 = str2 返回0
3.当 str1 > str2 返回正数
举例:
#include
二、 长度受限制的字符串函数 1.strncpy函数 函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );
头 文 件 :
函数功能:字符串拷贝:可以指定拷贝字符的个数;
参数解读:
1.char *strDest --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.size_t count --- 指定拷贝多少个字符
4.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.拷贝时:当拷贝的个数大于源字符串长度时(比如源字符串“abcd”,拷贝6个),不够的用补(设置个数时要合理)
2.拷贝时目标空间要足够大,保证放的下要拷贝过去的字符串
3.拷贝时目标空间必须可修改(不能被const修饰)
函数原型:char *strncpy( char *strDest, const char *strSource, size_t count );
头 文 件 :
函数功能:字符串拷贝:可以指定拷贝字符的个数;
参数解读:
1.char *strDest --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.size_t count --- 指定拷贝多少个字符
4.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.拷贝时:当拷贝的个数大于源字符串长度时(比如源字符串“abcd”,拷贝6个),不够的用补(设置个数时要合理)
2.拷贝时目标空间要足够大,保证放的下要拷贝过去的字符串
3.拷贝时目标空间必须可修改(不能被const修饰)
举例:
#include
#include
2.strncat函数 函数原型:char *strncat( char *strDest, const char *strSource, size_t count );
头 文 件 :
函数功能:字符串追加:可以指定追加字符的个数;
参数解读:
1.char *strDest --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.size_t count --- 指定追加多少个字符
4.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.追加时:当追加的个数小于源字符串的个数时,会主动追加''
2.追加时:当追加的个数大于源字符串的个数时,库函数的定义是只追加到''位置,所以个数就算很大并不影响
3.追加时目标空间必须可修改(不能被const修饰)
函数原型:char *strncat( char *strDest, const char *strSource, size_t count );
头 文 件 :
函数功能:字符串追加:可以指定追加字符的个数;
参数解读:
1.char *strDest --- 目标字符串
2.const char *strSource --- 源字符串(不可被修改)
3.size_t count --- 指定追加多少个字符
4.返回类型:char* --- 返回的是拷贝后源字符串的地址
注意事项:
1.追加时:当追加的个数小于源字符串的个数时,会主动追加''
2.追加时:当追加的个数大于源字符串的个数时,库函数的定义是只追加到''位置,所以个数就算很大并不影响
3.追加时目标空间必须可修改(不能被const修饰)
举例:
#include
3.strncmp函数 函数原型:int strncmp( const char *string1, const char *string2, size_t count );
头 文 件 :
函数功能:字符串比较:可以指定比较字符的个数;
参数解读:
1.string1 --- 被比较的字符串;
2.string2 --- 待比较的字符串;
3.size_t count --- 指定 比较多少个字符 (从前向后比较)
比较方法:
1.当 str1 < str2 返回负数
2.当 str1 = str2 返回0
3.当 str1 > str2 返回正数
函数原型:int strncmp( const char *string1, const char *string2, size_t count );
头 文 件 :
函数功能:字符串比较:可以指定比较字符的个数;
参数解读:
1.string1 --- 被比较的字符串;
2.string2 --- 待比较的字符串;
3.size_t count --- 指定 比较多少个字符 (从前向后比较)
比较方法:
1.当 str1 < str2 返回负数
2.当 str1 = str2 返回0
3.当 str1 > str2 返回正数
举例:
#include
三、其他字符串函数 1.strstr函数 函数原型:char *strstr( const char *string, const char *strCharSet );
头 文 件:
函数功能:字符串查找:在string中查找strCharSet是否存在;
参数解读:
1.string --- 被搜索的以空结尾的字符串;
2.strCharSet --- 要搜索的以空结尾的字符串;
注意事项:
1.当找到时:返回一个指针 strCharSet 在string中第一次出现的那个位置;
2.未找到时:返回一个空指针(NULL);
函数原型:char *strstr( const char *string, const char *strCharSet );
头 文 件:
函数功能:字符串查找:在string中查找strCharSet是否存在;
参数解读:
1.string --- 被搜索的以空结尾的字符串;
2.strCharSet --- 要搜索的以空结尾的字符串;
注意事项:
1.当找到时:返回一个指针 strCharSet 在string中第一次出现的那个位置;
2.未找到时:返回一个空指针(NULL);
举例:
#include
2.strtok函数 函数原型:char *strtok( char *strToken, const char *strDelimit );
头 文 件:
函数功能:字符串切分
功能:
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符,它包含0个或多个由sep字符串中一个或多个分隔符分割的标记
3.strtok函数找到str中的下一个标记,并将其用 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针
函数原型:char *strtok( char *strToken, const char *strDelimit );
头 文 件:
函数功能:字符串切分
功能:
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符,它包含0个或多个由sep字符串中一个或多个分隔符分割的标记
3.strtok函数找到str中的下一个标记,并将其用 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针
举例:
#include
四、内存操作函数 1.memcpy函数 函数原型:void *memcpy( void *dest, const void *src, size_t count );
头 文 件:or
函数功能:内存拷贝:(适用于内存不重叠的场景)
功能:
1.函数memcpy从src的位置开始向后复制count个字节的数据到dest的内存位置;
2.这个函数在遇到 的时候并不会停下来;
3.如果source和destination有任何重叠,复制的结果都是未定义的;
函数原型:void *memcpy( void *dest, const void *src, size_t count );
头 文 件:
or 函数功能:内存拷贝:(适用于内存不重叠的场景)
功能:
1.函数memcpy从src的位置开始向后复制count个字节的数据到dest的内存位置;
2.这个函数在遇到 的时候并不会停下来;
3.如果source和destination有任何重叠,复制的结果都是未定义的;
举例:
#include
2.memmove 函数 函数原型:void *memmove( void *dest, const void *src, size_t count );
头 文 件:
函数功能:内存拷贝:(适用于内存重叠或不重叠的场景)
注意事项:
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理
函数原型:void *memmove( void *dest, const void *src, size_t count );
头 文 件:
函数功能:内存拷贝:(适用于内存重叠或不重叠的场景)
注意事项:
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理
举例:
#include
3.memcmp函数 函数原型:int memcmp( const void *buf1, const void *buf2, size_t count );
头 文 件:or
函数功能:内存比较:(比较buf1和buf2指针开始的num个字节)
比较方法:
1.当buf1<buf2时 返回<0
2.当buf1=buf2时 返回=0
3.当buf1>buf2时 返回>0
函数原型:int memcmp( const void *buf1, const void *buf2, size_t count );
头 文 件:
函数功能:内存比较:(比较buf1和buf2指针开始的num个字节)
比较方法:
1.当buf1<buf2时 返回<0
2.当buf1=buf2时 返回=0
3.当buf1>buf2时 返回>0
举例:
#include
4.memset函数 函数原型:void *memset( void *dest, int c, size_t count );
头 文 件:or
函数功能:内存设置(memset函数将dest的第一个count个字节设置为字符c)
函数原型:void *memset( void *dest, int c, size_t count );
头 文 件:
函数功能:内存设置(memset函数将dest的第一个count个字节设置为字符c)
举例:
#include
五、库函数的模拟实现 1.模拟实现strlen函数 ①递归实现
①递归实现
#include
②计数器实现
#include
③指针 - 指针
#include
2.模拟实现strcpy函数
#include
#include
3.模拟实现strcat函数
#include
4.模拟实现strcmp函数
#include
5.模拟实现strncpy函数
#include
6.模拟实现strncat函数
#include
7.模拟实现strncmp函数
#include
8.模拟实现strstr函数
#include
9.模拟实现memcpy函数
#include
10.模拟实现memmove函数
#include
11.模拟实现memcmp函数
#include
12.模拟实现memset函数
#include
六、总结
以上的这些库函数大部分使用较多,深入了解并牢牢掌握其功能,对于这方面的解题会得心应手,笔者可能在模拟实现上不一定是最优解,但是可以帮助大家从了解到掌握。