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

编程技能:字符串函数03,strncpy

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:字符串函数02,strcpy

回到目录

下一篇:无

(二)MFC 专栏导航

上一篇:编程技能:字符串函数02,strcpy

回到目录

下一篇:无

本节前言

在上一节,我们讲解了字符串函数,strcpy,以及它的 Visual Studio 的安全增强版本,strcpy_s 。本节呢,我们来讲解一个跟 strcpy 比较像的函数,strncpy 。

一.    基本介绍

想要使用 strncpy 函数,如果是想要在 C 语言里面使用,那么,你需要有【#include <string.h>】一行。如果是想要在 C++ 里面使用,你需要有【#include <cstring>】一行。

下面,是 strncpy 函数的原型声明。

char * strncpy(char * dest, const char *src, int count);

我在这里所列的原型声明,它只是我从 Linux 0.12 内核中提取出来的一种声明而已。在 Visual Studio 里面,它的声明形式不是这样子的。但是呢,我在这里列举出来的声明,它是可用的。

此函数的功能为,将 src 指向的字符串的前 count 个字节复制到 dest 指向的字符数组中。

如果 src 所指向的源字符串的前 count 个字符,不包含 '\0' ,则复制了前 count 个字符之后,strncpy函数并不会自动地帮我们添加 '\0'。对于这种情况,添加 '\0',是我们编程人员的事情,我们需要手动地在字符串的结尾添加 '\0' 。

如果 src 所指向的源字符串的前 count 个字符之中,包含了 '\0',则复制完所遇到的第一个 '\0' 之后,复制工作便提前终止。此时,还剩下多少个字符没有复制,则 strncpy 会帮我们添加多少个 '\0' 。

举例来说,假定 src 的位置,前 7 个 char 型数据分别为:'a','b','c','\0','d','e','f' 。则复制字符串的时候,dest 的前四个字符的复制结果为:  'a','b','c','\0‘ 。复制到第 4 个字符的时候,发现是 '\0',因而,strncpy 不会继续复制 src 后面的字符了。此时,由于 dest 里面已经被复制了 4 个字符,而原本要复制的是 7 个,还剩下 3 个字符没有复制。于是, strncpy 就在后面再复制 3 个 '\0' 。最终的结果是,dest 位置的情况为:'a','b','c','\0','\0','\0','\0' 。

如果可以的话,我是真想把 strncpy 的实现给大家看一看。不过,我所参照的 Linux 0.12 内核,它所使用的,是 GCC 内联汇编 。也就是,它是在 C 语言程序之中,嵌入了汇编代码。此刻,有可能,你尚未学习过汇编语言,也尚未学习过内联汇编。所以,此刻,即使我将其展示出来了,估计,你也看不懂。

不过,在网上,其实是可以搜索到纯粹的 C 语言版本的 strncpy 的实现代码的。这个搜索工作,你自己去做吧。我就不领着大家来做了。

二.    strncpy 代码举例

#include <stdio.h>
#include <string.h>int main(void)
{char dest[100];char src[] = "Windows Program Design";dest[7] = '\0';strncpy(dest, src, 7);printf("目的字符串:%s\n", dest);return 0;
}

上述代码块,展示了 strncpy 函数的使用方法。

不过啊,它和 strcpy 有着类似的情况。上述代码,如果你是在 Visual Studio 里面去编译,会报错。微软建议,在 Visual Studio 里面,不要直接使用 strncpy 函数,而是使用它的安全版本,strncpy_s 。

三.    strncpy_s 函数

我们来看一看它的函数原型。

errno_t __cdecl strncpy_s(char * dest, const char *src, size_t count);

此函数的返回值是 errno_t 类型的。errno_t 类型,就是 int 类型。

size_t,就是 unsigned int 。

__cdecl,这个东西,此处我们先不用管。就目前的阶段来讲,你可以无视这个东西,而直接将此函数的原型声明看作是【errno_t strncpy_s(char * dest, const char *src, size_t count);

strncpy 与 strncpy_s 在声明方面有差异。区别就在于返回值的类型方面。然而,在实际去使用的时候,你怎么调用 strncpy,就怎么去调用 strncpy_s 就可以了。

假定,你需要这样子来使用 strncpy:strncpy(dest, src, 10) 。假定,你在 VS2019 里面编程,而 VS2019 不允许直接用 strncpy,那么,你需要使用安全增强的版本,strncpy_s 。此时,你需要这样子来写代码:strncpy_s(dest, src, 10) 。可以发现,两者的调用形式没啥区别,只不过是将 strncpy 替换为了 strncpy_s 而已。

另外呢,在 Visual Studio 里面不允许直接使用 strncpy,然而,在 Linux 操作系统里的著名的编译器 GCC 里面,你是可以直接使用 strncpy 的。

四.    strncpy_s 的 C 代码示例

#include <stdio.h>
#include <string.h>int main(void)
{char dest[100];char src[] = "Windows Program Design";dest[7] = '\0';strncpy_s(dest, src, 7);printf("目的字符串:%s\n", dest);return 0;
}

对于上面的代码块中的代码,你可以在 Visual Studio 中编译和运行,可以直接在 VS2019 中使用。

如果还不会在 Visual Studio 中编译运行 C/C++ 代码,请参考如下两个链接所示的文章。

Windows编程:使用 VS2010 编写 C语言程序-CSDN博客

Windows编程:用 VS2019 编写C语言程序-CSDN博客

运行结果如下。

图1

五.    strncpy_s 的 C++ 代码示例

#include <iostream>
#include <cstring>
using namespace std;int main(void)
{char dest[100];char src[] = "Windows Program Design";dest[7] = '\0';strncpy_s(dest, src, 7);cout << "目的字符串:" << dest << endl;return 0;
}

到了这里,我想,本节的内容,也就差不多了。

结束语

strncpy 和 strcpy,都适用于字符串拷贝的函数。希望大家能够学好它们。

本节,我在写作的时候,感觉写作难度还没有那么高。希望屏幕前的你,已经学好了本节内容以及上一节的 strcpy 的内容。

祝大家学习愉快。

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:编程技能:字符串函数02,strcpy

回到目录

下一篇:无

(二)MFC 专栏导航

上一篇:编程技能:字符串函数02,strcpy

回到目录

下一篇:无

http://www.xdnf.cn/news/5670.html

相关文章:

  • 碰一碰发视频源码搭建,支持OEM
  • 解决在 PowerShell 中 `javac -version` 命令无法运行
  • Qwen:Qwen3,R1 在 Text2SQL 效果评估
  • 1.5 连续性与导数
  • HDFS概述
  • XXE记录
  • 如何使用人工智能翻译WordPress网站
  • 如何进行前端性能测试?--性能标准
  • SnowAdmin - 功能丰富、简单易用的开源的后台管理框架,基于 Vue3 / TypeScript / Arco Design 等技术栈打造
  • Docke容器下JAVA系统时间与Linux服务器时间不一致问题解决办法
  • RN 鸿蒙混合开发实践(踩坑)
  • 用生活例子通俗理解 Python OOP 四大特性
  • 大中台,小前台:企业数字化转型的核心引擎
  • 多样本整合Banksy空间聚类分析(Visium HD, Xenium, CosMx)
  • Vector ASAP2
  • 智能网联汽车“内外协同、虚实共生”的通信生态
  • 理解多智能体深度确定性策略梯度MADDPG算法:基于python从零实现
  • TestNG接口自动化
  • Clion远程开发git触发“No such device or address”的解决方案
  • C++ 的 VS 项目中引入跨平台包管理工具 conan
  • IDEA 插件推荐:提升编程效率
  • P1874 快速求和
  • 笔记本电脑升级实战手册[3]:扩展内存与硬盘
  • Matlab 234-锂电池充放电仿真
  • 在 .NET 8 开发的WinForms 程序中展示程序版本号的几种方式
  • 运行Spark程序-在Idea中(二)
  • 汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
  • 多重背包、分组背包、混合背包和多维背包
  • 交易所开发-如何开发一个交易所
  • 【C语言】宏经典练习题,交换奇偶位