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

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 来确保字符串正确终止。


http://www.kler.cn/a/557517.html

相关文章:

  • Java中的Stream API:从入门到实战
  • Scrum方法论指导下的Deepseek R1医疗AI部署开发
  • Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)
  • Ubuntu 安装 Node.js 20.x
  • Promptic:Python 中的 LLM 应用开发利器
  • 配置haproxy实现MySQL服务器负载均衡
  • 【计算社会学】 多智能体建模 ABM Agent Based Modeling 笔记
  • JavaScript系列(81)--加密技术详解
  • JUC并发—9.并发安全集合四
  • TRL里面GRPOTrainer中grpo_train.py文件详解
  • CNN常用卷积核
  • 2025/2/22论文阅读
  • 使用docker配置PostgreSQL
  • [创业之路-321]:创新开拓思维和经营管理思维的比较
  • PHP post 数据丢失问题
  • 【部署优化篇十四】【十万字全景拆解:GitHub Actions自动化流水线设计圣经(DeepSeek工业级实践大公开)】
  • BGP配置华为——路径优选验证
  • CTF 代码学习日记 PHP
  • 基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
  • nodejs爬虫抓取数据快速入门