前言
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
前言
1. 字符分类函数
例:字母大小分类
例:字母大小写转换
字符串相关函数
strlen的函数使用和模拟实现
strlen的函数使用
strlen的模拟实现
法1
法2
法3:递归
strcpy的函数使用和模拟实现
strcpy的函数使用
strcpy的模拟实现
不返回
优化
返回目标空间的起始地址
strcat的函数使用和模拟实现
strcat的函数使用
strcat的模拟实现
strcmp的函数使用和模拟实现
strcmp的函数使用
strcmp的模拟实现
1. 字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,使⽤这些函数需要包含的头⽂件是 ctype.h
例:字母大小分类
判断大小写
例:字母大小写转换
大写转小写
字符串相关函数
字符串相关函数要包含头文件string.h
strlen的函数使用和模拟实现
strlen的函数使用
用于计算字符串的个数
- strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
- 参数指向的字符串必须要以 '\0' 结束。
- 注意函数的返回值为size_t,是⽆符号的
strlen的模拟实现
法1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char*str)
{
size_t count = 0;
//断言str不为空指针
assert(str != NULL);
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
size_t len = my_strlen(arr);
printf("%zd\n", len);
return 0;
}
法2
#include<stdio.h>
#include<assert.h>
//strlen的模拟实现
size_t my_strlen2(char* str)
{
assert(str != NULL);
char* start = str;
while (*str)
{
str++;
}
return str - start;
}
法3:递归
size_t my_strlen3(char* str)
{
assert(str != NULL);
if (*str)
{
return 1+my_strlen3(str+1);
}
else
{
return 0;
}
}
strcpy的函数使用和模拟实现
strcpy的函数使用
用于拷贝字符串
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷⻉到⽬标空间。
- ⽬标空间必须⾜够⼤,以确保能存放源字符串。
- ⽬标空间必须可修改
strcpy的模拟实现
不返回
#include<stdio.h>
void my_strcpy(char* dest, const char* src)
{
while (*src)//遇到\0就停下,跳出while循环
{
assert(dest != NULL);
assert(src != NULL);
//一个个字节从头开始拷贝
*dest = *src;
dest++;
src++;
}
*dest = *src;//最后把\0拷贝过去
}
int main()
{
char arr1[20] = "xxxxxxxxxxx";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
优化
#include<stdio.h>
//优化
void my_strcpy(char* dest, const char* src)
{
//若有一个为空指针,assert即为假
assert(dest &&src);
//先赋值(拷贝)地址再++
//最后\0拷贝过去后,整个表达式为0,跳出循环
while (*dest++=*src++)
{
;//空语句
}
}
返回目标空间的起始地址
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//若有一个为空指针,assert即为假
//先赋值(拷贝)地址再++
//最后\0拷贝过去后,整个表达式为0,跳出循环
char* ret = dest;//保留目标空间的起始位置
while (*dest++=*src++)
{
;//空语句
}
return ret;
}
strcat的函数使用和模拟实现
strcat的函数使用
用于追加字符串
- 源字符串必须以 '\0' 结束。
- ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
- ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
- ⽬标空间必须可修改。
strcat的模拟实现
注意:以下实现的my_strcat函数不可以自我追加,\0会被覆盖,造成死循环(越界访问)
#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest, const char* src)
{
assert(dest && src);
//保留目标空间的起始位置
char* ret = dest;
//1.找到目标空间的\0
while (*dest)
{
dest++;
}
//2.在dest后面拷贝src的内容
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcmp的函数使用和模拟实现
strcmp的函数使用
用于字符串比较,⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩,(不是比长度)。
第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
strcmp的模拟实现
#include<stdio.h>
int my_strcmp(const char* s1, const char* s2)
{
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
//return *s1-s2;
if (*s1 > *s2)
return 1;
else
return -1;
}
int main()
{
int ret = my_strcmp("abcdefg", "abcdefg");
printf("%d\n", ret);
return 0;
}