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 主要是内存块之间的拷贝
*/
//三者都有拷贝的功能,针对对象不同,应结合实际情况选择使用