- 前言
- 字符串的组成
- strlen
- 模拟实现stlen
- strcpy
- 模拟实现strcpy
- strcmp
- 模拟实现strcmp
- strcat
- 模拟实现strcat
前言
在使用下面介绍的库函数时声明以下头文件
#include <string.h>
字符串的组成
如下字符数组 str 看似只包含abcde五个字符,实际上由6个字符组成
char str[] = "abcde";
如下
字符串后面默认带有字符’\0’,这是字符串的结束标志,表示这串字符到结尾了
内存中字符串长度 = 有效字符个数 + 1( ‘\0’ )
需要注意的是:
1:'\0’是给计算器看的使其知道字符串到哪就结束了,但用户不需要看这个’\0‘字符,只需要计算机显示出其字符串有效字符即可。
2:用户看到的字符串不包含’\0‘字符,所以常说的有效字符串长度不包含’\0’
strlen
先看文档该函数的声明
从该声明可以看出strlen函数的函数参数是字符串指针,返回值是size_t类型
函数作用:返回其参数s的字符串有效长度,注意这个长度不包含’\0’
注意:
1:strlen不能用于测量字符,否则strlen会返回随机数
2:参数 s 所指向的字符串必须以’\0’结尾,否则strlen会返回随机数
模拟实现stlen
思路:用循环不断遍历指向字符的指针,并记录有效字符个数,字符 \0 的ASCII码值为 0 , 所以只要判断指针指向的内容为 \0 后会跳出循环即可
size_t my_strlen(const char* str)//只计算字符串长度,不修改内容所以使用const
{
assert(str);//str不能为空
int count = 0;
while (*str++){//字符 \0 的ASCII码值为 0 ,所以当str指向 \0 后会跳出循环
count++;//记录有效字符个数
}
return count;
}
测试:
strcpy
先看文档该函数的声明
参数 dest:是目标字符串地址
参数 src:是源字符串地址
作用:将源字符串内容(包括’\0’),拷贝到目标字符串地址中
返回值:为指向目标字符串的指针
实用方法如下:
使用strcpy时需注意:
1:源字符串必须以 ‘\0’ 结束。
2:strcpy会将源字符串中的 ‘\0’ 拷贝到目标空间。
3:目标空间必须足够大,以确保能存放源字符串
模拟实现strcpy
思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回
//模拟实现strcpy
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//保证dest和src都不为空,为空则报错
char* ret = dest;//保存dest的初始地址
while (*src) {//src不为'\0'就一直循环
*dest++ = *src++;
}
*dest = *src;//将src'\0'赋值给dest
return ret;//返回
}
使用方法如下:
strcmp
先看文档该函数的声明
其参数为:字符串s1和字符串s2
作用:函数strcmp的功能是比较两个字符串的大小。也就是把字符串str1和str2从首字符开始逐个字符的进行比较,直到某个字符不相同或者其中一个字符串比较完毕才停止比较。字符的比较为ASCII码的比较。
返回值:
若字符串s1大于字符串s2,返回结果大于零;
若字符串s1小于字符串s2,返回结果小于零;
若字符串s1等于字符串s2,返回结果等于零。
模拟实现strcmp
思路:
1:两个指针都不能为空否则程序会崩溃
2:两个字符串从起始字符开始,依此类推一 一对一两者字符ASCII码大小,如不相同时s1大则返回 1 ,s2大则返回-1
2:两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0
//模拟实现strcmp
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);//保证dest和src都不为空,为空则报错
while (1)
{
if (*s1 - *s2 != 0)//如不相同时s1大则返回 1 ,s2大则返回 - 1
{
return *s1 > *s2 ? 1 : -1;
}
if (*s1 == *s2 && *s2 == '\0')//两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0
return 0;
//当前字符相等,两者++,进行下一个字符的比较
s1++;
s2++;
}
}
使用方法如下:
strcat
先看文档该函数的声明
参数 dest:是目标字符串地址
参数 src:是源字符串地址
作用:将源字符串内容(包括’\0’),追加到目标字符串结尾(字符串的第一个’\0’)
使用方法如下:
注意:
1:源字符串必须以 ‘\0’ 结束。
2:目标空间必须有足够的大,能容纳下源字符串的内容。
3:目标空间必须可修改。
模拟实现strcat
思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:找到目标字符串第一个’\0’并将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回
//模拟实现strcat
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);//保证dest和src都不为空,为空则报错
char* ret = dest;//保存dest的初始地址
while (*dest){//循环结束后dest会指向'\0'字符
dest++;
};
while (*src){//src不为'\0'就一直循环
*dest++ = *src++;//将src字符赋值给dest
}
*dest = *src;//将src的'\0'赋值给dest
return ret;//返回dest的初始地址
}