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);}
自己学完网课后总结的可能不太完善(′~`;)