(C语言进阶)strcpy

内容重点:

重点介绍处理字符和字符串的库函数的使用和注意事项

 下面是将要介绍的几个函数:

  • 求字符串长度 strlen
  • 长度不受限制的字符串函数 strcpy (本节)strcat strcmp
  • 长度受限制的字符串函数介绍 strncpy strncat strncmp
  • 字符串查找 strstr strtok
  • 错误信息报告 strerror
  • 字符操作
  • 内存操作函数 memcpy memmove memset memcmp

strcpy

char* strcpy(char * destination, const char * source );

译文:

指向的C字符串复制到目标指向的数组中,包括终止的null字符(并在该点停止)。
为了避免溢出,目标指向的数组的大小应足够长,以包含与相同的C字符串(包括终止的null字符),并且在内存中不应与重叠。

注意:

  • 1.会将源字符串中的 '\0' 拷贝到目标空间。
  • 2.源字符串必须以 '\0' 结束。
  • 3.目标空间必须足够大,以确保能存放源字符串。
  • 4.目标空间必须可变。
  • 5.学会模拟实现。

0.strcpy的使用示例

#include <stdio.h>
#include<string.h>

int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);//将arr1的数据拷贝到arr2中
	printf("%s\n", arr2);
	return 0;
}

结果如下 :

1.会将源字符串中的 '\0' 拷贝到目标空间。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
 
int main()
{
	char arr1[] = "abc\0def";
	char arr2[20] = "xxxxxxxx";
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

输出结果为:

拷贝原理:

注:遇到 '\0'时,strcpy的拷贝停止。

 那么,如果拷贝内容没有包含'\0'呢?那就是下面这种情况

2.源字符串必须以 '\0' 结束。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
 
int main()
{
	char arr1[] = { 'a','b','c' };
	char arr2[20] = "xxxxxxxx";
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

输出结果:

拷贝原理:

解释:strcpy拷贝到'\0'就停止,但是没有'\0'只能继续拷贝直到找到'\0'。否则输出结果不为正确的拷贝结果。因此要遵守源字符串必须以 '\0' 结束。

3.目标空间必须足够大,以确保能存放源字符串。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
 
int main()
{
	char arr1[] = "abcdef";
	char arr2[3] = { 0 };
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}
//错误示范,目标空间必须足够大

输出结果:

(输出有误且有报错结果) 

报错:栈空间变量被破坏

因此,我们在拷贝的时候需要做到目标空间必须足够大,以确保能存放源字符串

4.目标空间必须可修改。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
 
int main()
{
	char* p = "abcdef"; //指针所指向的字符串为常量字符串,其内容不能被修改。
	char arr2[20] = "JX_BC";
	strcpy(p, arr2);
	printf("%s\n", arr2);
	return 0;
}
//该程序会崩溃

输出结果:

程序崩溃

调试: 

写入访问冲突

 用指针指向的字符串来举例,指针指向的内容是不可以改变的。也是错的例子,目标空间必须可以修改才可以实现。

5.学会模拟实现。

需要注意一点的是,这个函数的返回值是目标空间的起始地址。

代码实现:

#include<stdio.h>
#include<assert.h>
//返回的是目标空间的起始地址
char my_strcpy(char* dest, const char* src)//被拷贝的数据不能发生变化,因此加上const不可修改,加上const错位会报错
{
	char* ret = dest;//保证目标空间的起始地址不变
	assert(dest && src);//断言保证两个指针有效
	while (*dest++ = *src++)
	{
		;
	}
	return ret;//返回起始地址

}
int main()
{
	char str1[] = "hehelala";
	char str2[20] = { 0 };
	my_strcpy(str2, str1);
	printf("%s\n", str2);
  //printf("%s\n", my_strcpy(str2, str1));//注意这种情况时,函数返回类型不可以是void,因为这里是直接调用返回值类型,否则不能打印。
	return 0;
}

输出结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值