C++面试总结2:strcpy, sprintf, memcpy

使用方法

strcpy(String copy)

原型:char * strcopy(char * dest, const char * src);
功能:用于复制一个字符串到另一个字符串。
描述:将src指向的字符串(包括结束符\0)复制到dest指向的数组中。注意,要保证dest的空间是足够放下src的数据的,包括\0src内部如果遇到了\0也是会到此截止的。

#include <iostream>
#include <cstring>

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(String Print Format)

功能:sprintf 用于将格式化的数据写入字符串。
原型:int sprintf(char *str, const char *format, ...);
描述:该函数根据 format 字符串来格式化数据(可以是多种类型,如整数、浮点数、字符串等),并把格式化后的结果复制到 str 指向的字符串中。这里的 format 字符串类似于 printf 函数中使用的格式字符串.
这个就比较重要了,面试的时候提问过一次。

#include <iostream>
#include <cstdio>

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(Memory Copy)

功能:memcpy 用于复制一块内存的内容到另一块内存。
原型:void *memcpy(void *dest, const void *src, size_t n);
描述:该函数从 src 指向的内存地址开始复制 n 个字节到 dest 指向的内存地址。与 strcpy 和 sprintf 不同,memcpy 对于数据的内容没有任何假设,它只是简单地复制字节。因此它可以用来复制任何类型的数据,包括字符串、数组、结构体等。
注意:src 和 dest 的内存区域不应重叠,如果需要处理重叠内存区域的情况,应使用 memmove 函数。

#include <iostream>
#include <cstring>

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;
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值