size_t strlen ( const char * str );
1. 字符串以 '' 作为结束标志, strlen 函数返回的是在字符串中 '' 前面出现的字符个数(不包 含 '' ) 2. 参数指向的字符串必须要以 '' 结束。 3.注意函数的返回值为 size_t ,是无符号的( 易错 )
#include1.2.strlen函数模拟实现#include int main() { int len=strlen("abcdef"); printf("%dn",len); return 0; }
模拟实现方法: 1.计数器的方法 2.递归方法 3.指针-指针模拟实现1:(计数器的方法)
#includeint my_strlen(const char* str) { assert(str); int count = 0; while (*str) { count++; str++; } return count; } int main() { int len = my_strlen("abcdef"); printf("%dn", len); return 0; }
注:
1. *** 作符sizeof的返回类型其实是size_t类型的,size_t类型本质上是unsigned_int类型 2.用size_t来接收strlen函数的返回值有好处也有不好的地方,好处是长度一定是一个正数,用无符号整型接收更合理,坏处如下图所示,用无符号返回值进行计算,使用时不顺手,易引入bug。模拟实现2:(递归方法)
#includeint my_strlen(const char* str) { assert(str); if (*str == '') return 0; else return 1 + my_strlen(str + 1); } int main() { int len = my_strlen("abcdef"); printf("%dn", len); return 0; }
模拟实现3:(指针-指针)
#includeint my_strlen(char* s) { assert(str); char* p = s; while (*p != '') p++; return p - s; } int main() { int len = my_strlen("abcdef"); printf("%dn", len); return 0; }
2.strcpy函数 2.1.strcpy函数介绍
char* strcpy ( char * destination , const char * source )
源字符串必须以 '' 结束 会将源字符串中的 '' 拷贝到目标空间 目标空间必须足够大,以确保能存放源字符串 目标空间必须可变(只读数据区的内容不可更改)
#include2.2.strcpy函数模拟实现 模拟实现1:#include int main() { char arr1[]="abcdef"; char arr2[20]={0}; strcpy(arr2,arr1); printf("%sn",arr2); return 0; }
#include#include #include char* my_strcpy(char* dest, const char* src) { assert(dest && src); char* ret = dest; while (*src) { *dest = *src; dest++; src++; } *dest = *src; return ret; } int main() { char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f', ''}; char arr2[20] = "xxxxxxxxxxxx"; my_strcpy(arr2, arr1); printf("%sn", arr2); return 0; }
模拟实现2:(改进版)
#include#include #include char* my_strcpy(char* dest, const char* src) { assert(dest && src); char* ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f', ''}; char arr2[20] = "xxxxxxxxxxxx"; my_strcpy(arr2, arr1); printf("%sn", arr2); return 0; }
3.strcat函数 3.1.strcat函数介绍
char * strcat ( char * destination , const char * source );
功能:将源字符串的内容追加到目标字符串的后面 源字符串必须以 '' 结束。 目标空间必须有足够的大,能容纳下源字符串的内容。 目标空间必须可修改。
#include3.2.strcat函数模拟实现 模拟实现:#include int main() { char arr1[30]="hello"; char arr2[]="word"; strcat(arr1,arr2); printf("%sn",arr1); return 0; }
#include#include #include char* my_strcat(char* dest, const char* src) { char* ret = dest; assert(dest && src); //1. 目标空间中的 while (*dest) { dest++; } //2. 追加内容到目标空间 while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[30] = "hello"; char arr2[] = "world"; my_strcat(arr1, arr2); printf("%sn", arr1); return 0; }
注:
1.若想知道编译器函数库中某函数是怎样实现的,通过以下步骤可观察(以strcat函数为例)
步骤一:打开everything,搜索该函数名,找到.c文件步骤二:单机鼠标右键,点击打开路径
步骤三:找到.c文件所在文件夹,将该文件拖入vs编译器窗口
步骤四:这里就是函数库中要找函数的实现代码
4.strcmp函数 4.1.strcmp函数介绍
int strcmp ( const char * str1 , const char * str2 );
功能:比较对应位置上的字符大小
标准规定: 第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个字符串,则返回 0 第一个字符串小于第二个字符串,则返回小于 0 的数字
#include4.2.strcmp函数模拟实现 模拟实现1:#include int main() { char arr1[30]="abcdef"; char arr2[]="abq"; int ret=strcmp(arr1,arr2); printf("%dn",ret); return 0; }
#include#include #include int my_strcmp(const char* str1, const char*str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '') return 0; str1++; str2++; } if (*str1 > *str2) return 1; else return -1; } int main() { char arr1[] = "abc"; char arr2[] = "abc"; int ret = my_strcmp(arr1, arr2); if (ret<0) { printf("arr10) { printf("arr1>arr2"); } else { printf("arr1==arr2"); } return 0; }
注:
此处,在主函数打印时,一定不能用-1、1、0进行判断,因为标准规定返回值是一个>0、<0、=0的值(其他编译器就不一定是只返回-1、1、0三个了数字),下面就是错误的例子。
模拟实现2:
#include#include #include int my_strcmp(const char* str1, const char*str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '') return 0; str1++; str2++; } return *str1 - *str2; } int main() { char arr1[] = "abc"; char arr2[] = "abc"; int ret = my_strcmp(arr1, arr2); if (ret<0) { printf("arr10) { printf("arr1>arr2"); } else { printf("arr1==arr2"); } return 0; }
5.strncpy函数
char * strncpy ( char * destination , const char * source , size_t num );
拷贝 num 个字符从源字符串到目标空间 如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个
代码1:
#include#include int main() { char arr1="xxxxxxxxxxxxxxxx"; char arr2[]="hello word"; strncpy(arr1,arr2,5); printf("%sn",arr1); return 0; }
运行结果1:
代码2:
#include#include int main() { char arr1[] = "xxxxxxxxxxxxxx"; char arr2[] = "he"; strncpy(arr1, arr2, 5); printf("%sn", arr1); return 0; }
运行结果2:
运行调试2:
6.strncat函数
char * strncat ( char * destination , const char * source , size_t num );
strncat函数对目标字符串进行追加,有两种情况 1. 若源字符串的长度小于等于 num: 遇到源字符串的停止,只将源字符串进行追加完即可(与strncpy函数不同) 2. 若源字符串的长度大于 num:追加源字符串的num个字符,然后在追加的最后一个字符后面补一个代码1:
#include#include int main() { char arr1[20]="hello"; char arr2[]="word"; strncat(arr1,arr2,5); printf("%sn",arr1); return 0; }
运行结果1:
代码2:
#include#include int main() { char arr1[20] = "hello"; char arr2[] = "word"; strncat(arr1, arr2, 2); printf("%sn", arr1); return 0; }
运行结果2:
代码3:
#include#include int main() { char arr1[20] = "helloxxxxxxxxx"; char arr2[] = "word"; strncat(arr1, arr2, 3); printf("%sn", arr1); return 0; }
运行结果3:
运行调试3:
代码4:
#include#include int main() { char arr1[20] = "helloxxxxxxxxx"; char arr2[] = "word"; strncat(arr1, arr2, 7); printf("%sn", arr1); return 0; }
运行结果4:
运行调试4:
7.strncmp函数
int strncmp ( const char * str1 , const char * str2 , size_t num );
标准规定: 第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个字符串,则返回 0 第一个字符串小于第二个字符串,则返回小于 0 的数字代码1:
#include#include int main() { char arr1[]="abcdef"; char arr2[]="abcqqqqqq"; int ret=strncmp(arr1,arr2,3); printf("%dn",ret); return 0; }
运行结果1:
代码2:
#include#include int main() { char arr1[]="abcdef"; char arr2[]="abcqqqqqq"; int ret=strncmp(arr1,arr2,4); printf("%dn",ret); return 0; }
运行结果2:
代码3:
#include#include int main() { char arr1[] = "abcwef"; char arr2[] = "abcqqqqqq"; int ret = strncmp(arr1, arr2, 4); printf("%dn", ret); return 0; }
运行结果3:
8.strstr函数 8.1.strstr函数介绍
char * strstr ( const char * str1 , const char * str2 );
功能:在str1字符串中找str2字符串。若找到str2了,返回str2第一次出现的起始地址;若找不到str2,返回一个空指针。代码1:
#include#include int main() { char arr1[]="abcdefabcdef"; char arr2[]="bcd"; char* ret=strstr(arr1,arr2); if(NULL==ret) printf("没找到n"); else printf("%sn",ret); return 0; }
运行结果1:
代码2:
#include#include int main() { char arr1[] = "abcdefabcdef"; char arr2[] = "bcdq"; char* ret = strstr(arr1, arr2); if (NULL == ret) printf("没找到n"); else printf("%sn", ret); return 0; }
运行结果2:
8.2.strstr函数模拟实现模拟实现:
#include#include #include char* my_strstr(const char* str, const char* substr) { const char* s1 = str; const char* s2 = substr; const char* cur = str; assert(str && substr); if (*substr == '') { return (char*)str; } while (*cur) { s1 = cur; s2 = substr; while (*s1!='' && *s2!='' && *s1 == *s2) { s1++; s2++; } if (*s2 == '') return (char*)cur; cur++; } return NULL; } int main() { char arr1[] = "abbbcdef"; char arr2[] = "bbc"; char* ret = my_strstr(arr1, arr2); if (NULL == ret) printf("没找到n"); else printf("%sn", ret); return 0; }
9.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)