C strncpy() 语法
strncpy() 是 C 语言 <string.h> 标准库的一个函数,它用于将一个字符串复制 “指定数量” 的字符到另一个字符串中去,然后返回指向目标字符串的指针。
strncpy() 是 strcpy() 的更安全的版本,因为它允许限制复制的字符数量,这样可以防止缓冲区溢出。
语法:
strncpy(dest, src, n)说明:
strncpy() 函数接收以下 3 个参数。
dest(char*):目标字符串的指针。src(const char*):源字符串的指针。n(size_t):复制多少个字符。
strncpy(dest, src, n) 会从 src 字符串的开头复制最多 n 个字符到 dest 指向的内存位置。复制会在以下 2 种情况之一发生时停止:
- 已复制了 n 个字符。
- 在复制了少于 n 个字符时,遇到了源字符串 src 的终止符 '\0'。
对于 strncpy() 函数,小伙伴们要注意以下 2 点。
- 如果 src 的长度(不包括 '\0')小于 n,那么 strncpy() 会复制完 src 的内容,然后在 dest 的末尾用空字符 '\0' 填充剩余的部分,直到总共写入了 n 个字符。
- 如果 src 的长度(不包括 '\0')大于或等于 n,strncpy() 会正好复制 n 个字符到 dest。在这种情况下,strncpy() 不会在 dest 的末尾添加终止符 '\0'。这意味着 dest 可能不会是一个以 '\0' 结尾的有效 C 字符串。
提示: strncpy 是 “string n copy” 的缩写。
C strncpy() 摘要
| 使用频率 | 高 |
|---|---|
| 修改字符串 | 是 |
| 官方文档 | 查看 |
C strncpy() 示例
接下来,我们通过几个简单的例子来讲解一下 C strncpy() 函数是如何使用的。
示例 1:strncpy() 基本用法
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "Go";
char str2[] = "Python";
strncpy(str1, str2, 2);
puts(str1);
puts(str2);
printf("%zu\n", strlen(str1));
printf("%zu", strlen(str2));
return 0;
}运行结果如下。
Py
Python
2
6分析:
strncpy(str1, str2, 2); 表示将 str2 中的前 2 个字符复制到 str1 中。从结果可以看出,strncpy() 函数会将新的内容直接替换原来的内容。
示例 2:strncpy() 提取字符串的前缀
#include <stdio.h>
#include <string.h>
int main(void)
{
const char str[] = "www.lvyenet.com";
char prefix[10]; // 缓冲区,用于存放前 3 个字符 + 终止符
size_t n = 3; // 提取前 3 个字符
// 提取前缀
strncpy(prefix, str, n);
// 手动添加终止符
prefix[n] = '\0';
printf("原始字符串: %s\n", str);
printf("提取的前缀: %s\n", prefix);
return 0;
}运行结果如下。
原始字符串 : www.lvyenet.com
提取的前缀 : www分析:
在这个例子中,我们尝试使用 strncpy() 来提取字符串的前缀。首先指定复制前 3 个字符,并确保目标缓冲区 prefix 足够大。由于源字符串长度大于 n(3),strncpy() 不会添加终止符,所以我们需要在复制的末尾手动添加 '\0'。
strncpy() 的应用场景
strncpy() 函数适用于需要限制复制字符数量的字符串复制场景,主要包括以下几种情况。
- 从一个较大的缓冲区安全地提取固定长度的字符串片段。
- 将字符串复制到固定大小的缓冲区,避免溢出风险。
- 解析固定格式的数据,提取特定字段的内容。
虽然 strncpy() 相较于 strcpy() 更安全,但其在源字符串长度大于等于 n 时,不会自动添加终止符,小伙伴们需要特别注意这一点。
也就是说,我们需要手动处理终止符,否则可能引入新的错误。在 C11 标准及以后,我们可以考虑使用更安全的 strcpy_s() 函数(如果环境支持的话)。
