strcpy() ,sprintf()和 memcpy()

C 语言字符串和内存操作函数

strcpy()sprintf()memcpy() 都是 C 语言中的标准库函数,用于 字符串复制、格式化字符串和内存拷贝。它们的功能和适用场景不同:

函数作用适用于
strcpy()复制 C 字符串复制 char* 类型的字符串
sprintf()格式化字符串并存入缓冲区生成字符串,类似 printf()
memcpy()拷贝内存(可以拷贝任意数据)复制二进制数据或结构体

1. strcpy():复制 C 字符串

📌 作用

strcpy() 用于复制字符串(char*,目标缓冲区需要足够大,否则可能导致缓冲区溢出(Buffer Overflow)

✅ 正确用法

#include <iostream>
#include <cstring>

int main() {
    char src[] = "Hello, World!";
    char dest[50];  // ✅ 确保足够大
    strcpy(dest, src);  // ✅ 复制字符串

    std::cout << "Copied string: " << dest << std::endl;  // 输出 "Hello, World!"
    return 0;
}

📌 dest 必须足够大,否则可能导致 strcpy() 访问越界,造成崩溃!

❌ 错误示例(目标空间不够)

char dest[5];
strcpy(dest, "Hello, World!");  // ❌ 越界访问,可能崩溃

📌 应使用 strncpy() 限制复制长度

strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0';  // ✅ 确保字符串结尾

2. sprintf():格式化字符串

📌 作用

  • sprintf() 类似于 printf(),但它不会输出到屏幕,而是存入 char* 缓冲区
  • 支持格式化字符串,可用于数字转换、日期格式化等。

✅ 示例

#include <iostream>
#include <cstdio>

int main() {
    char buffer[100];
    int num = 42;
    double pi = 3.14159;

    sprintf(buffer, "Number: %d, Pi: %.2f", num, pi);
    std::cout << buffer << std::endl;  // 输出 "Number: 42, Pi: 3.14"
}

📌 sprintf() 格式化字符串,并存入 buffer,避免了 strcpy() 的限制

sprintf() 可能导致缓冲区溢出

char smallBuffer[5];
sprintf(smallBuffer, "This is a long text");  // ❌ 可能溢出

📌 应使用 snprintf() 限制最大字符数

snprintf(smallBuffer, sizeof(smallBuffer), "This is a long text");

3. memcpy():拷贝内存

📌 作用

  • memcpy() 用于拷贝二进制数据(可以是字符串、数组、结构体)。
  • strcpy() 更通用,可以拷贝非字符串数据(如 intstruct)。
  • 不会自动添加 \0 结尾,必须手动添加。

✅ 示例

#include <iostream>
#include <cstring>

struct Person {
    char name[20];
    int age;
};

int main() {
    Person p1 = { "Alice", 25 };
    Person p2;

    memcpy(&p2, &p1, sizeof(Person));  // ✅ 复制整个结构体
    std::cout << "Name: " << p2.name << ", Age: " << p2.age << std::endl;
}

📌 memcpy() 直接拷贝 struct,适用于二进制数据复制。

⚠️ memcpy() 不能用于字符串拷贝

char src[] = "Hello";
char dest[10];

memcpy(dest, src, sizeof(src));  // ✅ 复制字符串,但不会自动加 `\0`

📌 如果 src 不是以 \0 结尾,目标 dest 可能不是有效的字符串!


4. strcpy() vs memcpy() vs sprintf() 对比

功能strcpy()memcpy()sprintf()
拷贝数据类型仅字符串(char*任意数据(包括二进制)格式化字符串
是否自动加 \0
是否安全可能溢出安全(只拷贝指定大小)可能溢出
适用场景字符串复制结构体/数组拷贝格式化字符串

5. 什么时候使用哪种函数?

场景推荐方法
复制字符串strcpy()(但 strncpy() 更安全)
格式化字符串sprintf()(但 snprintf() 更安全)
拷贝二进制数据(如 structmemcpy()
避免缓冲区溢出strncpy() / snprintf()

🚀 C++ 代码建议使用 std::string 代替 strcpy(),更安全、易用! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值