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