C strncat() 函数

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

上一篇: strcat()

下一篇: strcmp()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号