700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 字符串库函数(1)Strlen strcpy strcat strcmp

字符串库函数(1)Strlen strcpy strcat strcmp

时间:2023-05-04 18:02:37

相关推荐

字符串库函数(1)Strlen strcpy strcat strcmp

C语言没有字符串类型.字符串通常放在常量字符串或字符数组中(字符串常量适用于不做修改的字符串函数。

结束标志为‘\0’

运行时一直到 '\0'时才结束,所以运行起来不是太安全

strlen

计算字符串长度

用例:

int main(){int len = strlen("KFCCrazyThursdayVme50");printf("%d\n", len);return 0;}

原理:strlen获取字符串地址,从第一个字符开始向后找'\0',找不到计数器就加1,直到找到'\0'为止。上述输出为21。

错误用例:

int main(){char arr[] = { 'k','f','c','v','m','5','0' };int len = strlen(arr);printf("%d\n", len);return 0;}

输出结果为74,这个结果实际为随机的一个值,

因为这样定义的arr里结尾没有 '\0'

strlen找不到就一直往后找,直到找到'\0'为止。

所以strlen计算的字符串一定要以'\0'结尾。

自己实现strlen函数

1.计数器方法

int my_strlen(const char* str){int a=0;//引入计数器while (*str)//str的值为0(\0)时自动结束{a++;str++;}return a;}

2.递归法(不创建临时变量的方法)

int my_strlen(const char* str){if (*str != '\0')return 1 + my_strlen(++str);elsereturn 0;}

注意:使用strlen函数时,若出现以下情况时

if(strlen("abc")- strlen("abcde")<0)printf("aaaa");

输出不了结果

因为strlen返回值类型为无符号数

以下的函数:strcat,strcpy,strcmp是长度不受限制的字符串函数

strcpy

字符串拷贝

用例

int main(){char arr1[]="covermeaaaa";char arr2[]="coveryou";strcpy(arr1, arr2);printf("%s", arr1);return 0;}

原理:取得两个字符串地址后从第一个字符开始拷贝,直到遇到'\0',

因此strcpy函数处理的复制源头的字符串也必须含有 '\0'

自己实现strcpy

char* my_strcpy(char* pre,const char* re){while (*pre++=*re++){};return pre;}

(while(*pre++=*re++)中,同时进行了赋值,指针值增加,判断循环进行

使代码更简洁。

注意点:(假设函数为 strcpy (arr1,arr2) )

1.arr2中必须包含'\0',不然会造成越界访问

2.arr1中空间必须比arr2大,否则空间不足

3.arr1不能为常量字符组,无法改变常量字符组的内容,函数无法运行

strcat

字符串追加

用例

int main(){char arr1[20]=" 哼哼";char arr2[]="啊啊啊啊啊";strcat(arr1, arr2);printf("%s", arr1);return 0;}

原理

导入arr1指针后,指针向后移动到'\0'从\0开始进行与strcpy一样的操作

自己实现strcat

char* my_strcat(char* pre,const char* re){while (*pre!='\0'){pre++;}while (*pre++=*re++){};return pre;}

注意(在strcat(arr1,arr2)中)

1.保证arr1空间足够

2.追加时arr2中的'\0'会一起加上去,且arr2中必须包含‘\0'

strcmp

字符串的比较

用例

int main(){char arr1[]="wwwwww";char arr2[]="QAQaaa";int a = strcmp(arr1, arr2);printf("%d", a);return 0;}

该函数是从两数组第一个字符开始,对比两字符的ASCII码值

从第一个开始,

若arr1>arr2的字符ASCII则返回一个正数

若arr1<arr2的字符ASCII则返回一个负数

若arr1=arr2的字符ASCII则跳至下一个字符

直到比较出大小

或者到两个字符都是'\0'时返回0

自己实现strcmp

int my_strcmp(const char* p1,const char* p2){while (p1==p2){if (p1 == '\0')//判断此时两字符串是否到最后一位都相等return 0;p1++;p2++;}if (*p1 > *p2)return 1;if (*p2 > *p1)return -1;}

注意:

VS编译系统下返回的正数是1,负数是-1,不同编译系统不一样

在其他编译系统下若要返回随机正负值

可以如下设置

int my_strcmp(const char* p1,const char* p2){while (p1==p2){if (p1 == '\0')//判断此时两字符串是否到最后一位都相等return 0;p1++;p2++;}return (*p1-*p2);}

自己学完网课后总结的可能不太完善(′~`;)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。