目录
一、strlen函数(计算字符串长度)
1、strlen函数的用途
2、strlen函数的使用
3、strlen函数的模拟实现
二、strcpy函数(字符串拷贝)
1、strcpy函数的用途
2、strcpy函数的使用
3、strcpy函数的模拟实现
三、strcat函数(字符串追加)
1、strcat函数的用途
2、strcat函数的使用
3、strcat函数的模拟实现
四、strcmp函数(两个字符串比较)
1、strcmp函数的用途
2、strcmp函数的使用
3、strcmp函数的模拟实现
一、strlen函数(计算字符串长度)
1、strlen函数的用途
它是计算字符串长度的库函数,由下面的图片可知用法:
返回值size_t 是unsigned int (无符号整型)通过重命名后的类型。
const的用法:const char* str,const修饰在* 前,表示 *str不可以被改变,str可以改变。如果改成char * const str ,const修饰在*的后面,表示str不可改变,*str可以被改变。
注意:
strlen 函数接受字符串地址时,从该地址往后计算字符的个数直到遇到 ‘\0’ 结束,‘\0’ 是字符串结束的标志,它不再计算的范围个数内。
2、strlen函数的使用
int main()
{
const char* str1 = "abcdef";
int ret = strlen(str1);
printf("长度为:%d\n", ret);
return 0;
}
但是在这里有个容易出错的例题如下:
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if (strlen(str2) - strlen(str1) > 0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
解析:
在这里大家有的会认为是str1 > str2,但是这里的结果值str2 > str1,为什么呢?因为strlen函数的返回值是无符号整形,所以在相减过程任然是无符号整形,所以大于0,然后就执行第一条语句。
3、strlen函数的模拟实现
分析一下:因为这个strlen函数是以‘\0’作为结束的标志,所以先设置一个变量用作计数,当*str不为0时,往后移,然后count++,直到遇到‘\0’结束,跳出循环。
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
二、strcpy函数(字符串拷贝)
1、strcpy函数的用途
它是用来拷贝字符串的库函数,由下面的图片可知详细用法:
注意:
1、源字符串必须以 '\0' 结束。
2、会将源字符串中的 '\0' 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变。
2、strcpy函数的使用
int main()
{
char arr1[] = "XXXXXXXX";
char arr2[] = "abcde";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
运行结果:
3、strcpy函数的模拟实现
在while循环的小括号内,有一个赋值表达式,这个表达式是先将字符赋值给dest ,当赋值表达式执行成功后,根据*dest的值进行条件判断。这样下来就形成了一种,先赋值后判断的循环逻辑,同时,当赋值结束时,进行后置加加,赋值下一个字符。因此当遇到‘\0’的时候先将其赋值给目标空间,然后再利用目标空间内的‘\0’进行条件判断,终止循环。
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while ((*dest++ = *src++))
{
;
}
return ret;
}
三、strcat函数(字符串追加)
1、strcat函数的用途
它是在一个字符串后面追加另一个字符串的库函数,由下面的图片可知详细用法:
注意:
1、源字符串必须以 '\0' 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。
4、字符串自己不可以给自己追加。
2、strcat函数的使用
int main()
{
char str1[20] = "aaaaa";
char str2[] = "bbbbb";
strcat(str1, str2);
printf("%s\n", str1);
return 0;
}
运行如下:
3、strcat函数的模拟实现
这个和上面的strcpy很相似,它需要先判断要追加字符串的结束位置,然后再进行赋值。
char* my_strcat(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
四、strcmp函数(两个字符串比较)
1、strcmp函数的用途
它用来比较两个字符串的大小的库函数,由下面的图片可知详细用法:
这个函数在平时是很常用的,我们需要注意的是这个函数的比较规则,这个函数会从两个字符串的第一位开始比较,比较的是二者的ASCII码值,如果二者不同,那么就直接返回对应的结果。如果相同,则继续比较第二位元素对应字符的ASCII码值,直到比出差异。假如整个字符串都和另外一个字符串相等,那么就会返回0,代表二者相同。
标准规定:
1、第一个字符串大于第二个字符串,则返回大于0的数字
2、第一个字符串等于第二个字符串,则返回0
3、第一个字符串小于第二个字符串,则返回小于0的数字
2、strcmp函数的使用
int main()
{
char str1[] = "abcdef";
char str2[] = "ade";
int ret = strcmp(str1, str2);
if (ret > 0)
{
printf("str1>str2\n");
}
else if (ret < 0)
{
printf("str1<str2\n");
}
else
{
printf("str1=str2\n");
}
return 0;
}
运行如下:
3、strcmp函数的模拟实现
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0') //当s1=='\0'的时候s1与s2相等
{
return 0;
}
s1++;
s2++;
}
return *s1 - *s2;
}
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。