当前位置: 首页 > news >正文

strcpy与strncpy作为复制函数的用法与区别

1、strcpy 

是 C 语言标准库中的一个函数,用于将一个字符串复制到另一个字符串中。它的原型定义在 <string.h> 头文件中,用法如下:

char *strcpy(char *dest, const char *src);
  • dest 是指向目标字符串的指针,即复制操作的结果将存储在这里。
  • src 是指向源字符串的指针,即要复制的内容。

strcpy 函数会将 src 指向的字符串(包括终止的空字符 \0)复制到 dest 指向的位置。复制完成后,dest 将指向一个新的字符串,该字符串与 src 相同。

需要注意的是,strcpy 不会自动为目标字符串分配内存。因此,在使用 strcpy 之前,必须确保 dest 指向的内存区域足够大,能够容纳源字符串及其终止的空字符。

示例 1:基本用法

#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[50]; // 确保目标数组有足够的空间
strcpy(dest, src);
printf("Source: %s\n", src);
printf("Destination: %s\n", dest);
return 0;
}

输出:

Source: Hello, World!
Destination: Hello, World!

示例 2:复制部分字符串

虽然 strcpy 本身会复制整个字符串,但你可以通过限制目标数组的大小来间接实现部分复制(不过这样做通常不安全,因为 strcpy 不会检查目标数组的大小)。更安全的方法是使用 strncpy

然而,为了说明 strcpy 的工作原理,这里只展示一个基本的例子,但请注意,这种做法在实际应用中可能会导致缓冲区溢出。

#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, Long String!";
char dest[10]; // 目标数组空间不足
// 这将导致缓冲区溢出,因为 src 字符串比 dest 数组长
strcpy(dest, src);
// 下面的输出可能是未定义的,因为 dest 没有足够的空间来存储完整的 src 字符串
printf("Destination (unsafe): %s\n", dest);
// 在实际应用中,应该避免这样做,并使用 strncpy 或确保 dest 有足够的空间
return 0;
}

注意:上面的代码是不安全的,因为 dest 数组没有足够的空间来存储 src 字符串及其终止的空字符。在实际应用中,应该使用 strncpy 或确保目标数组有足够的空间。

2、strncpy

为了避免缓冲区溢出,可以使用 strncpy 函数,它允许你指定要复制的最大字符数。

#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, Long String!";
char dest[10];
strncpy(dest, src, sizeof(dest) - 1); // 复制最多 9 个字符,留出空间给 '\0'
dest[sizeof(dest) - 1] = '\0'; // 确保字符串以 '\0' 结尾(strncpy 可能不会这样做,如果源字符串太长)
printf("Destination (safe): %s\n", dest);
return 0;
}

输出:

复制代码

Destination (safe): Hello

在这个例子中,strncpy 只复制了 src 字符串的前 9 个字符到 dest,并手动在末尾添加了空字符 \0 来确保字符串正确终止。

相关文章:

  • 洛谷 P1102 A-B 数对(详解)c++
  • Element UI中messageBox怎么区分点击取消按钮关闭弹窗,和点击右上角x号以及点击遮罩层关闭按钮
  • 运维脚本——8.证书自动化管理
  • 使用 Three.js 实现流光特效
  • Hutool - Log:自动识别日志实现的日志门面
  • 解释性语言与编译性语言
  • 解决 Vue.js 中使用 vue-print-nb 打印一页的问题
  • 现代企业软件测试人员需求与发展方向深度解析
  • 独立开发者之SEO基础:dofollow和 nofollow
  • 【部署优化十五】【深度揭秘《DeepSeek安全审计:OWASP Top10防护方案》】
  • Redis基础学习
  • 对计算机中缓存的理解和使用Redis作为缓存
  • dockerfile 使用环境变量
  • 【Java高级篇】——第16篇:高性能Java应用优化与调优
  • 当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?
  • 装箱和拆箱是什么?(C#)
  • 关于Java 反射的简单易懂的介绍
  • 一文熟练掌握Spring Framework
  • 以初学者视角探索智能体学习之旅
  • 新书上线 |《零门槛AIGC应用实战——Serverless+AI 轻松玩转高频AIGC场景》免费下载
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 暴雨及强对流天气黄色预警已发布!南方进入本轮降雨最强时段
  • 习近平向“和平薪火 时代新章——纪念中国人民抗日战争和苏联伟大卫国战争胜利80周年中俄人文交流活动”致贺信
  • 专访|李沁云:精神分析不会告诉你“应该怎么做”,但是……
  • 中方对原产印度进口氯氰菊酯实施反倾销措施,商务部回应
  • 巴基斯坦所有主要城市宣布进入紧急状态,学校和教育机构停课