一.strlen的使用
我先简单介绍一下strlen的功能和返回值,我们知道,字符串以'\0'为结束标志,(1)而strlen统计的是'\0'之前的所有的字符个数。(2)注意strlen的返回值是sizeof_t类型,是无符号的(3)strlen的实现必须包含头文件string.h。
关于这strlen有很重要的点需要注意,先给大家看一个代码。
#include <stdio.h>
#include <string.h>
int main()
{
if (strlen("abc") - strlen("abcdef")>0)
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
这串代码的最终打印出来的是>,这里明明是3减去6为什么最终结果是大于呢?大家别忘了,这里的strlen的返回值是sizeof_t类型,这种类型是无符号的,也就是说前面的那个负号就不是负号,而是有效位,是一个非常大的正数。如果想得到负数,当然就要强制转化一下。
二.strlen的模拟实现
1.计数器的方式
这种方法相对来说是最简单的,咱们只需要依次递增判断什么时候到达字符串的尾部'\0',增加一个计数器就行。
int my_strlen(const char* a)
{
int b = 0;
while(*a)
{
b++;
a++;
}
return b;
}
int main()
{
int ret = my_strlen("abc");
printf("%d", ret);
return 0;
}
2.用指针减指针的方式
直接上代码
#include <stdio.h>
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
int main()
{
printf("%d", my_strlen("abc"));
return 0;
}
这里就是简单的一个strlen的实现,两个指针相减得到的就是这两个指针指向的位置的元素的差值,在这里的结果就是3。
3.用递归的方式
主要就是递归的思维大家要清晰。
#include <stdio.h>
int my_strlen(char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return 1 + my_strlen(str + 1);
}
}
int main()
{
printf("%d", my_strlen("abc"));
return 0;
}
三.strcpy的使用
这个函数的作用是复制,需要两个参数,sourse这个参数就是源字符串,destination是目的地。有几点需要注意一下。(1)源字符串必须要以'\0'结束(2)会将源字符串中的'\0'拷贝到目标空间(3)目标空间必须足够大,以确保能存放源字符串(4)目标空间必须可修改
我先简单运用一下这个函数,简单了解是干什么的。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello world";
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
我用strcpy把arr1里的字符串复制到了arr2,最终我给一个arr2来打印,也是可以成功打印出来hello world的。注意:我们在拷贝的时候一定要确保源字符串是以'\0'结束的。因为拷贝的同时也把'\0'拷贝了下来。此时这里的arr2是一个完整的字符串,用strlen也可以测量出它的长度。
四.strcpy的模拟实现
#include<stdio.h>
char* my_strcpy(char* arr2, const char* arr1)
{
char* p = arr2;
while (*arr1 != '\0')
{
*arr2 = *arr1;
arr1++;
arr2++;
}
*arr2 = *arr1;
return p;
}
int main()
{
char arr1[] = "hello world";
char arr2[20] = { 0 };
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
在这里跟之前的代码也都大差不差,还是以'\0'为界限,只不过这里多加了一个*arr2=*arr1,用这个的目的就是把arr1里的'\0'也给拷贝到arr2里。当然我们最好用一下assert断言来防止arr1和arr2是空指针,别忘了头文件,如果不知道assert是什么可以点开我的头像看一下我的另一篇博客。
五.strncpy的使用
strncpy和strcpy是十分相似的,都是拷贝的作用,但是用法又有不同,这里的strncpy是长度受到限制的字符串函数。而且相比于strcpy,strncpy多了一个长度参数,其他的两个参数都是一样的。
这里我简单运用一下这个函数。
#include<stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[20] = {0};
strncpy(arr2, arr1, 3);
printf("%s", arr2);
return 0;
}
这个最终拷贝出来的就是abc。也就是说,我想拷贝几个字符直接在后面写多大的数字就行了。但是如果我拷贝的字符数量大于了最大的字符数量,那么超出来的部分就会直接补'\0'。
在这里我们用调试窗口逐一的看一下各个值的变化,可以看到这里的arr2[6]和arr2[7]都变成了'\0'。
那么关于这个函数的使用应该也是很清晰的了,主要就是关于拷贝多少个字符,后面有没有'\0'的问题,strncpy拷贝时,如果大于了字符个数就会补上'\0'。
感谢观看,请多多指正