strcpy和sprintf和memcpy的区别.md

strcpy、sprintf和memcpy的区别

下面代码说明:

#include <iostream>
using namespace std;
#include <string.h>
void strcpyMethod()
{
	/*
	char *strcpy(char *dest, const char *src) :C 库函数 把 src 所指向的字符串复制到 dest
	*/
	char str1[15] = "AAAAAAAAA";
	char str2[8] = "abcdefg";	//由于字符串,还要加个'\0'的结束符,所以是8
	char str3[] = "12345678890";
	cout << "str2:" << str2 << endl;
	strcpy(str1, str2);	//将str2 拷贝给str1
	//strcpy(str1, str3);	//error: 越界:str3长度大于str1数组大小
	cout << "str1:" << str1 << endl;

	//注意:字符串都以'\0'结束
	cout << str2[0] << endl;
	cout << str2[1] << endl;
	cout << str2[2] << endl;
	cout << str2[3] << endl;
	cout << str2[4] << endl;
	cout << str2[5] << endl;
	cout << str2[6] << endl;
	cout << str2[7];
	cout << "体现出结束标志符" << endl;

	cout << str1[0] << endl;
	cout << str1[1] << endl;
	cout << str1[2] << endl;
	cout << str1[3] << endl;
	cout << str1[4] << endl;
	cout << str1[5] << endl;
	cout << str1[6] << endl;
	//cout << str1[7];
	cout << "Test" << endl;

	//strcpy(str1, "hello world");	//error: 越界:hello world长度大于str1数组大小
	strcpy(str1, "hello");
	cout << str1 << endl;

	/*
	输出:
		str2:abcdefg
		str1:abcdefg
		a
		b
		c
		d
		e
		f
		g
		 体现出结束标志符
		a
		b
		c
		d
		e
		f
		g
		Test
		hello
	*/
}

void sprintfMethod()
{
	/*
	int sprintf(char *str, const char *format, ...) : 发送格式化输出到 str 所指向的字符串
	*/

	char str_spr[100];
	sprintf(str_spr, "I am a %s hi %d C++ %c", "student", 123, 'a');	//格式化字符串,%s :字符串 %d:整数 %c:字符
	cout << str_spr << endl;
	cout << "-----------------------------" << endl;
	char str_temp[] = "h%c 1%d1 %s C++!";
	char buf[100];
	sprintf(buf, str_temp, 'i', 2, "hello");	//str_temp 为待格式化的字符串,str_temp格式化输出到buf
	cout << "buf:	" << buf << "\tlen:	" << "	" << strlen(buf) << endl;

	/*
	输出:
		I am a student hi 123 C++ a
		-----------------------------
		buf:    hi 121 hello C++!       len:            17
	*/
}

void memcpyMethod()
{
	/*
	void *memcpy(void *str1, const void *str2, size_t n) :C 库函数 从存储区 str2 复制 n 个字符到存储区 str1
	*/

	char str1[] = "abcdefg";
	char str2[10];
	char str3[10];
	memcpy(str2, str1, strlen(str1)+1);	//由于由于strlen只是获得str1的实际长度,并没包含'\0',所以加1将'\0'包含进去
	memcpy(str3, str1, 2);
	str3[2] = '\0';	//由于没有'\0',所以要手动添加结束标志符
	cout << str2 << endl;
	cout << str3 << endl;
	/*
	输出:
		abcdefg
		ab
	*/

	//覆盖原数据
	char dest [] = "123456";
	const char *src = "*****";
	memcpy(dest, src, strlen(src));
	//注意:从src中复制到dest的字符串的长度不能超过dest的实际长度,否则会因为越界报错
	//若要不报错,则要事先设计 dest的大小 大于 strlen(src)
	cout << dest << endl;
	
	//输出: *****6

	const char *p = "ABCDEFGH";
	char pstr[20];
	memcpy(pstr, p + 2, 5);	//从p的第二个位置开始连续复制5个到pstr中
	pstr[5] = '\0';
	cout << "p: "<<p << endl;
	cout << "pstr:"<<pstr << endl;
	
	/*
	输出:
	p: ABCDEFGH
	pstr:CDEFG
	*/
}

int main()
{
	strcpyMethod();
	sprintfMethod();
	memcpyMethod();
	return 0;
}
/*
strcpy、sprintf和memcpy三者的区别:
(1)操作对象不同,strcpy的两个操作对象均为字符串类型;
	sprintf的源操作对象可以是多种类型,目的操作对象是字符串;
	memcpy的两个操作对象是两个可任意操作的内存地址,不限于任何数据类型
(2)执行效率不同,memcpy最高,strcpy次之,sprintf最低
(3)实现功能不同,strcpy实现两个字符串变量之间的拷贝,
	sprintf实现其他数据类型格式化到字符串之间的转化,
	memcpy 主要是内存块之间的拷贝
*/
//三者都有拷贝的功能,针对对象不同,应结合实际情况选择使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值