博客主页:PH_modest的博客主页
当前专栏:C语言跬步积累
其他专栏:
每日一题
读书笔记
每日反刍
座右铭:广积粮,缓称王!
1.strlen函数返回值类型是size_t(无符号整型);
请看下面代码输出的是什么:
#include
#include
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
很多人可能觉得输出结果是<,他们认为结果是-3,所以是<;
但其实结果不然
原因很简单,就是因为strlen的返回值是无符号整型,无符号数-无符号数结果还是无符号数,无符号数是没有负号的,恒大于0
2.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ )。
3.参数指向的字符串必须要以 ‘\0’ 结束,否则返回值将会是一个随机值
#include
int my_strlen(char* arr)
{
int flag = 0;
while(*arr != '\0')
{
flag++;
arr++;
}
return flag;
}
int main()
{
char arr[] = "abcde";
int ret = 0;
ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
#include
#include
int my_strlen(const char* arr)
{
assert(arr);//断言,判断一下arr是否是空指针,使代码更加安全
if (*arr != '\0')
{
return 1 + my_strlen(arr + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "abcde";
int ret = 0;
ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
- 源字符串必须以’\0’结束;
- 会将源字符串中的’\0’拷贝到目标空间;
- 目标空间必须足够大,才能确保能存放源字符串;
- 目标空间必须可修改;(即不能用const进行修饰)
为了方便大家理解,请判断以下代码有何问题?
代码1:
#include
#include
int main()
{
char* p = "abcdef";
char arr[10]="ghi";
strcpy(p,arr);
printf("%s\n",p);
return 0;
}
该代码是错误的,p的类型是char*,这是一个指向字符串常量的指针,指向的内容是不可修改的
#include
#include
char* my_strcpy(char* arr2, const char* arr1)
{
char* ret = arr2;//返回的是目标空间的起始地址,所以需要保存起始地址
assert(arr1 && arr2);
while(*arr1 != '\0')
{
*arr2 = *arr1;
arr1++;
arr2++;
}
*arr2 = *arr1;
return ret;//返回起始地址
}
int main()
{
char arr1[10] = "hehe!";
char arr2[20] = "0";
char ret = "0";
ret = my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
- 源字符串必须以’\0’结束;
- 目标空间必须有足够大的、能容纳下源字符串的内容;
- 目标空间必须可修改;
- 字符串不能给自己追加
#include
#include
char* my_strcat(char* arr1, const char* arr2)
{
char* ret = arr1;//将首地址赋给ret,便于最后返回字符串的首地址
assert(arr1 && arr2);
char* pc = arr1;
while (*pc != '\0')//找到目标空间的'\0'
{
pc++;
}
while (*pc++ = *arr2++)//拷贝
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[10] = "bit!";
my_strcat(arr1, arr2);
printf("%s\n",arr1);
return 0;
}
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
注意: strcmp返回值并非是和0,1比较的,但有些编译器可能大于时返回1,小于时返回-1,等于时返回0,这点需要注意一下,在之后判断时最好和0比较,即判断返回值是大于0,还是小于0,还是等于0
#include
#include
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;
}
arr1++;
arr2++;
}
return (*arr1 - *arr2);
}
int main()
{
char arr1[20] = "abceef";
char arr2[20] = "abceaf";
int ret = 0;
ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
- 如果能找到,返回找到的字符串的首地址
- 如果没找到,返回空指针(NULL)
#include
#include
char* my_strstr(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
char* p1 = (char*)arr1;//用来游历,比较是否相等,不相等会返回
char* p2 = (char*)arr2;
char* str = (char*)arr1;//用来标记,便于返回
while (*str)
{
p1 = str;
p2 = (char*)arr2;
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return str;
}
else
{
str++;
}
}
return NULL;
}
int main()
{
char arr1[20] = "abbcdefg";
char arr2[20] = "bcd";
char* ret = NULL;
ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
本篇博客粗略的介绍了一下部分字符串函数,这些字符串函数都是长度不受限制的,还有部分长度受限制的字符串函数将在本专栏下一篇中讲解,感兴趣的欢迎订阅本专栏。