C strncat() 语法
strncat() 是 C 语言 <string.h> 标准库的一个内置函数,用于将一个字符串中指定数量的字符连接到另一个字符串的末尾。
与 strcat() 不同的是,strncat() 提供了一个额外的参数来限制连接的字符数量,这样可以防止缓冲区溢出。
语法:
strncat(dest, src, n)说明:
strncat() 函数接收以下 3 个参数。
dest(char*):目标字符串的指针。src(const char*):另一个字符串的指针。n(size_t):要连接的最大字符数。
strncat(dest, src, n) 会将 src 前 n 个字符(或者直到遇到 '\0',取两者之间的较小值)复制到 dest 的末尾,覆盖 dest 原有的终止符 '\0'。复制完成之后,strncat() 会在结果字符串的末尾添加一个终止符 '\0'。
strncat() 函数会返回一个指向目标字符串 dest 的指针。
提示: strncat 是 “string n concatenate” 的缩写。
C strncat() 摘要
| 使用频率 | 高 |
|---|---|
| 修改字符串 | 是 |
| 官方文档 | 查看 |
C strncat() 示例
接下来,我们通过几个简单的例子来讲解一下 C strncat() 函数是如何使用的。
示例 1:strncat() 基本用法
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[20] = "Go";
char str2[] = "Python";
strncat(str1, str2, 2);
puts(str1);
puts(str2);
return 0;
}运行结果如下。
GoPy
Python分析:
strncat(str1, str2, 2); 表示将 str2 的前 2 个字符连接到 str1 的末尾。从结果可以看出来,strncat(str1, str2) 会修改第 1 个字符串,但不会修改第 2 个字符串。
如果不希望修改原字符串,我们可以先使用 strcpy() 函数将原字符串复制一份,然后再使用 strncat() 函数进行拼接。
示例 2:使用 strcpy() + strncat()
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[] = "Go";
char str2[] = "Python";
char result[50];
// 复制 str1 到 result
strcpy(result, str1);
// 拼接 str2 到 result 末尾
strncat(result, str2, 2);
// 打印结果
puts(str1);
puts(str2);
puts(result);
return 0;
}运行结果如下。
Go
Python
GoPy分析:
在这个例子中,我们首先使用 strcpy(result, str1) 来将 str1 复制到 result 中,然后再使用 strncat(result, str2, n) 将 str2 的前 2 个字符拼接到 result 的末尾。这样操作下来,就不会修改原字符串 str1 了。
示例 3:“源字符串长度” 小于 “指定连接数量”
#include <stdio.h>
#include <string.h>
int main(void)
{
char dest[30] = "Beginning: "; // 目标字符串
const char src[] = "End"; // 源字符串
size_t n = 10; // 指定连接 10 个字符
strncat(dest, src, n);
printf("%s\n", dest);
return 0;
}运行结果如下。
Beginning: End分析:
在这个例子中,我们指定连接 10 个字符 (n = 10),但源字符串 "End" 的实际长度(不包括 '\0')只有 3 个字符。
strncat() 会复制源字符串直到遇到终止符 '\0',或者达到指定的 n 个字符,它取两者之间的较小值。因此,它只复制了 "End" 到 dest 的末尾,并添加了终止符。
示例 4:strncat() 连接空字符串
#include <stdio.h>
#include <string.h>
int main(void)
{
char dest[20] = "Initial";
const char src[] = ""; // 空字符串
size_t n = 5;
strncat(dest, src, n);
printf("%s\n", dest);
return 0;
}运行结果如下。
Initial分析:
如果源字符串 src 是一个空字符串,无论指定的连接数量 n 是多少(大于 0),strncat() 都不会复制任何字符到目标字符串,因此目标字符串内容保持不变。
strncat() 与 strcat() 的区别
strncat() 与 strcat() 的主要区别在于:strncat() 增加了一个 n 参数,用于限制从源字符串中复制到目标字符串的字符数量。这使得 strncat() 在处理字符串连接时更加安全,可以有效地避免缓冲区溢出的问题。
相比之下,strcat() 会一直复制直到遇到源字符串的终止符 '\0',如果目标缓冲区不够大,就会发生问题。
为了绝对安全,参数 n 不应该只是 “我想复制多少个字符”,而应该是 “目标数组还剩下多少空间”。通常写法是:
sizeof(dest) - strlen(dest) - 1