原型:char * strcopy(char * dest, const char * src);
功能:用于复制一个字符串到另一个字符串。
描述:将src
指向的字符串(包括结束符\0
)复制到dest
指向的数组中。注意,要保证dest
的空间是足够放下src
的数据的,包括\0
;src
内部如果遇到了\0
也是会到此截止的。
#include
#include
int main() {
char src[] = "This is a very long string, possibly longer than expected";
char dest[10]; // 故意设置较小的目标空间
// 错误用法:这里会导致缓冲区溢出,因为dest的空间不足以存放src的全部内容
// strcpy(dest, src);
// 正确用法:确保目标数组足够大
char correctDest[sizeof(src)];
strcpy(correctDest, src);
std::cout << "Correctly copied string: " << correctDest << std::endl;
return 0;
}
功能:sprintf
用于将格式化的数据写入字符串。
原型:int sprintf(char *str, const char *format, ...);
描述:该函数根据 format 字符串来格式化数据(可以是多种类型,如整数、浮点数、字符串等),并把格式化后的结果复制到 str 指向的字符串中。这里的 format 字符串类似于 printf 函数中使用的格式字符串.
这个就比较重要了,面试的时候提问过一次。
#include
#include
int main() {
char buffer[50];
int num = 123;
double pi = 3.14159;
const char* msg = "Number and Pi";
// 正确用法
sprintf(buffer, "Message: %s, Number: %d, Pi: %.2f", msg, num, pi);
// 潜在的错误用法:如果格式化后的字符串长度超过buffer的大小,会导致缓冲区溢出
// char smallBuffer[10];
// sprintf(smallBuffer, "Message: %s, Number: %d, Pi: %.2f", msg, num, pi);
std::cout << "Formatted string: " << buffer << std::endl;
return 0;
}
功能:memcpy
用于复制一块内存的内容到另一块内存。
原型:void *memcpy(void *dest, const void *src, size_t n);
描述:该函数从 src 指向的内存地址开始复制 n 个字节到 dest 指向的内存地址。与 strcpy 和 sprintf 不同,memcpy 对于数据的内容没有任何假设,它只是简单地复制字节。因此它可以用来复制任何类型的数据,包括字符串、数组、结构体等。
注意:src 和 dest 的内存区域不应重叠,如果需要处理重叠内存区域的情况,应使用 memmove
函数。
#include
#include
struct Data {
int id;
double value;
};
int main() {
Data src = {1, 9.5};
Data dest;
// 正确用法:复制整个结构体
memcpy(&dest, &src, sizeof(Data));
std::cout << "Copied Data - ID: " << dest.id << ", Value: " << dest.value << std::endl;
// 潜在的错误用法:内存重叠
// memcpy(&src, ((char*)&src)+2, sizeof(Data) - 2); // 这可能导致未定义的行为
return 0;
}