专栏导航
本节文章分别属于《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博客
运行结果如下。

五. 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
回到目录
下一篇:无