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);
}