在c语言的编写中,我们常会运用到字符和字符串类型,相关的字符串函数知识也是必不可少的,接下来我将介绍下字符串函数中strlen和strcpy。
strlen的介绍:
strlen是用来计算字符串长度的函数,从字符串的起始地址出发,一直到字符串中的“\0”停止,但最终计数是不包括“\0”的,返回类型为
size_t strlen ( const char * str );
传入的参数为字符串首字母的地址
返回值为 size_t 无符号整型,即unsigned int
strlen的使用介绍:
要使用strlen() 就要包含头文件<string.h>
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdefg";
int tmp = strlen(arr);
printf("%d", tmp);
return 0;
}
输出结果:
值得注意的是,strlen()将会一直往后数,直到遇到"\0"才会停止,所以当你使用strlen来求字符数组时,必须要在数组最后添加元素"\0"
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = {'a','b','c','d','\0'};
int tmp = strlen(arr1);
printf("%d", tmp);
return 0;
}
运行结果为:
关于strlen()的模拟实现
法一,直接计数
int my_strlen(const char* arr)
{
assert(arr != NULL);
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
可以模拟实现strlen()的功能
其中assert是为了判断传入的指针是否为空指针。
法二,递归法
每次递归让arr所指的地址+1,直到'\0'的地址返回0
int my_strlen(const char* arr)
{
assert(arr != NULL)
if (*arr != '\0')
return 1 + my_strlen(arr + 1);
else
return 0;
}
法三,指针减指针法
两个指针相减,所得的结果为两个指针之间的元素个数
因此我们可以先找到字符串首字母的地址、'\0'的地址,再将两个指针相减,即为字符串的长度
int my_strlen(const char* arr)
{
assert(arr != NULL);
char* p = arr;
while (arr != '\0')
{
arr++;
}
return p - arr;
}
strcpy()的介绍:
传入参数
char * strcpy ( char * destination, const char * source );
char* destination ------ 你黏贴的地址
const char* source -------- 你复制的地址
使用注意事项:
1.原字符串必须包含"\0",且“\0”也会被复制到你的粘贴处
2.粘贴处的空间必须足够大,能放得下复制的内容
3.粘贴处必须可修改
strcpy()的使用介绍
使用示例1:
int main()
{
char arr1[] = "abcdefg";
char arr2[20] = { 0 }; //初始化数组大小为20是为了有足够的空间放下拷贝的字符串
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
运行结果:
从监视窗口可以看到,strcpy()将 arr1[ ] 的 “ \0 ” 之前的字符串都拷贝到 arr[ ] 中,包含" \0 "本身
使用示例2:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = {'a','b','c','d','\0'}; \\注意必须要有\0
char arr2[20] = { 0 };
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
运行结果:
示例介绍3:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdefg";
char * p = "xxxxxxxx";
strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
以上程序将无法运行,因为strcpy()要求粘贴处必须为可修改的空间,但 p 是常量字符串,无法被修改,出现错误。
关于strcpy()的模拟实现
初阶
简单遍历原字符串,一个个拷贝到目标空间
void my_strcpy(char* dest, char* src)
{
//拷贝\0前的字符
while(*src != '\0')
{
*dest = *src;
dest++;
src++;
}
//拷贝字符\0
*dest = *src;
}
高阶
在初阶的基础上作了两处更改
1.循环条件的改变,赋值表达式的返回值就是所赋的值,\0的值就是0,所以当 *src 移动到 '\0' 时的返回值就是0,此时循环条件为假,while循环终止。
2.my_strcpy()返回值的改变,由void变成了char*,试想,当你使用strcpy时,你把对象复制到目标空间,这时你接下来应该是想对目标空间进行操作,那你希望这时char* dest改变吗?那肯定是不希望的,所以就先将dest储存起来再返回。
char* my_strcpy(char* dest, char* src)
{
char* ret = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)
{
;
}
return ret;
}
以上就是本篇文章的全部内容了,如果对你有帮助,可以点个赞吗
你的支持是我写作的最大动力!