1. 程式人生 > >strcpy和sprintf和memcpy的區別.md

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 主要是記憶體塊之間的拷貝
*/
//三者都有拷貝的功能,針對物件不同,應結合實際情況選擇使用