前言
2022/10/07
本人小白,如果有错误请大佬指明 ☆*: .。. o(≧▽≦)o .。.:*☆
笔记打卡
一、求字符串的长度及其模拟实现
1.strlen函数
(1)注意事项
1.字符串以’\0’为结束标志,strlen函数计算的是从第一个开始到出现’\0’的字符个数。
2.参数指向的字符串必须要有’\0’,否则个数不准确
char arr1[] = "I love China";
int len = strlen(arr1);
printf("%d", len);
运行结果:12
char arr1[] ={'a','b','c'};
int len = strlen(arr1);
printf("%d", len);
运行结果:74(随机)
3.注意函数的返回值类型为size_t,是无符号的
int main()
{
if (strlen("abc") - strlen("abcdef") > 0)
printf(">\n");
else
peintf("<=\n");
return 0;
}
运行结果: >
运算逻辑:
strlen(“abc”) -->3
strlen(“abcdef”) -->6
但无符号数相减也为无符号数
原本3-6 --> -3
但此刻的-3以补码的形式存储在计算机中
最高位不是符号位,所以被转化为一个超级大的正数
2. 模拟实现strlen函数
(1)计数器的版本
int my_strlen1(const char* str)
{
int count = 0;//计数器
while (*str != '\0')
{
count++;
str++;
}
return count;
}
(2)不创造临时变量-递归的版本
int my_strlen2(const char* str)
{
if (*str != '\0')
{
str++;
return 1+my_strlen2(str);
}
}
(3)指针减去指针的版本
同类型的指针可以进行相减,结果为两指针之间差的该指针指向类型的元素个数。
int my_strlen3(const char* str)
{
char* p = str;
while (*p != '\0')
p++;
return p - str;
}
二、字符串复制函数及其模拟实现
1.strcpy函数
//visual studio为了解决之前函数的越界的问题,_s系列的函数又分别增加了一些形参,比如长度等,所以,即使我们在C语言函数的基础上加上_s,还是会出现参数太少或形参类型和实参类型不匹配的问题。查看_s函数的形参列表的方式是:将光标移到你要查询的函数名里,然后单击右键,选择查看定义(或者使用快捷键 Alt + F12),然后就可以看到新版本的安全的C函数的形参列表了,根据这个形参列表设置实参就可以了
int main()
{
char arr[20] ;
strcpy_s(arr, 20,"hello");
printf("%s\n", arr);
return 0;
}
运行结果:hello
int main()
{
char arr[20] = "##############" ;
strcpy_s(arr, 20,"hello");
printf("%s\n", arr);
return 0;
}
运行结果:hello
因为strcpy拷贝字符串时也会拷贝 ‘\0’ ,后面没有被覆盖的字符串会丢失
arr–>h e l l o \0 # # # # # # # #
int main()
{
char arr1[5];
char arr2[20] = "Hello world";
strcpy_s(arr1, 5,arr2);
printf("%s\n", arr1);
return 0;
}
运行结果:运行失败
无足够大的空间存储
注意:储放拷贝字符串的数据一定要可以修改
2.模拟实现strcpy函数
void my_strcpy(char arr[], char arr2[])
{
int i = 0;
int j = 0;
while (arr2[j] != '\0')
{
arr[i] = arr2[j];
i++;
j++;
}
printf("%s\0", arr);
}
3.strncpy函数
int main()
{
char arr[20] = "abcdefg";
char arr2[20] = "qwer";
strncpy(arr,arr2, 3);
printf("%s\n", arr);
return 0;
}
运行结果:qwedefg
它比strcpy多一个参数,可以通过控制参数来控制拷贝的字符个数
4.模拟实现strncpy函数
void my_strncpy(char arr[], char arr2[],int count)
{
int i = 0;
int j = 0;
while (arr2[j] != '\0'&&j<count)
{
arr[i] = arr2[j];
i++;
j++;
}
printf("%s\0", arr);
}
三、字符串连接函数及其模拟实现
1.strcat函数
int main()
{
char arr1[20] = "hello ";
char arr2[20] = "world";
strcat_s(arr1,20, arr2);//字符串连接
printf("%s\n", arr1);
return 0;
}
运行结果:hello world
运行逻辑:arr1–>h e l l o(空格)\0
arr2–>w o r l d \0
连接时会覆盖掉第一个字符串的\0并将第二个字符串的\0
连接过去
运行后:arr1–>h e l l o (空格)w o r l d \0
1.源字符串必须以 ‘\0’ 结尾
2.目标空间必须足够大,能容纳源字符串的内容
3.目标空间必须可修改
2.模拟实现strcat函数
(1)指针版本
void my_strcpy_s(char* dest,const char* src)
{
//1.找到目标字符串的\0
while (*dest)//如果为\0则为假
dest++;
//2.连接源字符串,包含\0
while (*dest++ = *src++);
}
(2)数组版本
void my_strcpy(char arr[], char arr2[])
{
int i = 0;
int j = 0;
while (arr[i] != '\0')
i++;
while (arr[j] != '\0')
{
arr[i] = arr2[j];
i++;
j++;
}
printf("%s\0", arr);
}
3.strncat函数
int main()
{
char arr1[20] = "abcdefg";
char arr2[29] = "abeert";
strncat(arr1,arr2, 3);
printf("%s\n",arr1);
return 0;
}
运行结果:abcdefgabe
运行逻辑:将后面字符串的n位字符连接在前面字符串上(n为最后输入的那个参数)
4.模拟实现strncat函数
void my_strncat(char arr[], char arr2[],int count)
{
int i = 0;
int j = 0;
while (arr[i] != '\0')
i++;
while (arr[j] != '\0'&&j<count)
{
arr[i] = arr2[j];
i++;
j++;
}
printf("%s\0", arr);
}
四、字符串比较函数及其模拟实现
1.strcmp函数
错误比较
int main()
{
int arr[20];
char* p = "obc";
char* q = "abcdef";
if (p > q)
printf(">\n");
else
printf("<=\n");
return 0;
}
错误原因:如果这样直接比较,比较的只是这两个字符串储放在计算机中地址的大小
正确比较
int main()
{
int ret;
ret = strcmp("abc", "abd");
printf("%d", ret);
return 0;
}
比较逻辑:
依次比较对应位数的字符的ASCLL值,
前面的小于后面的输出小于0的整数
后面的小于前面的输出小于0的整数
各位的相等则输出0
比较的大小与字符串的长度无关
2.模拟实现strcmp函数
int my_strcmp(const char* s1, const char* s2)
{
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return *s1 - *s2;
}
3.strncmp函数
int main()
{
char*p = "abcdefg";
char*q = "abcert";
int ret = strncmp(p, q, 3);
printf("%d\n", ret);
return 0;
}
或
int main()
{
char arr[20] = "abcdefg";
char arr2[20] = "abcert";
int ret = strncmp(arr, arr2, 3);
printf("%d\n", ret);
return 0;
}
运行结果:0
strncmp后面的整型参数为互相比较字符的个数,超出个数的字符不进行比较
使用指针和数组都一样
4.模拟实现strncmp函数
int my_strncmp(const char* s1, const char* s2, int count)
{
int i = 1;
while (*s1 == *s2 && i < count)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
i++;
}
return *s1 - *s2;
}
后言
感谢鹏哥教导
请大家多多支持(●’◡’●)