歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++語言cstring庫之memcpy與memcpy_s

C++語言cstring庫之memcpy與memcpy_s

日期:2017/3/1 10:07:08   编辑:Linux編程

C++語言cstring庫之memcpy與memcpy_s:

// void *memcpy(void *dest, const void *src, size_t count);
// errno_t memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count);

void test_memcpy_string()
{
char *s = "Golden Global View";
char d1[19], d2[10], d3[19], d4[10];

// 1. sizeof(dest) >= sizeof(src) + 1時
memcpy(d1, s, strlen(s));
d1[strlen(s)] = 0;
std::cout << "d1: " << d1 << std::endl;

// 2. sizeof(dest) < sizeof(src) + 1時
// memcpy(d2, s, strlen(s)); // 會出錯, 這也是memcpy不安全的原因
// d2[strlen(s)] = 0;
memcpy(d2, s, sizeof(d2) - 1);
d2[sizeof(d2) - 1] = 0;
std::cout << "d2: " << d2 << std::endl;

// 3. 使用memcpy_s代替memcpy, sizeof(dest) >= sizeof(src) + 1時
errno_t err1 = memcpy_s(d3, sizeof(d3), s, strlen(s));
d3[strlen(s)] = 0;
std::cout << "d3: " << d3 << std::endl;

// 4. 使用memcpy_s代替memcpy, sizeof(dest) < sizeof(src) + 1時
errno_t err2 = memcpy_s(d4, sizeof(d4), s, sizeof(d4) * sizeof(char));
d4[sizeof(d4) - 1] = '\0';
std::cout << "d4: " << d4 << std::endl;
}

void test_memcpy_struct()
{
struct {
char name[13];
int age;
} person, person_copy;

// myname有16個字符.
char* myname = "Pierre de Fermat";

// 復制字符串
std::cout << sizeof(person.name) << std::endl;
std::cout << sizeof(person) << std::endl;
std::cout << strlen(myname) << std::endl;

memcpy(person.name, myname, strlen(myname));
person.age = 46;
std::cout << person.name << std::endl;

// 復制結構體
memcpy(&person_copy, &person, sizeof(person));
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age);
}

Copyright © Linux教程網 All Rights Reserved