ZetCode

C strncat 函数

最后修改:2025 年 4 月 8 日

字符串操作是 C 编程中的基础,而 strncat 是安全连接字符串的关键函数。本教程将深入介绍 strncat,包括其语法、用法以及相对于 strcat 的优势。我们将探讨实际示例,并讨论为什么 strncat 是安全编程的首选。理解 strncat 有助于防止缓冲区溢出,同时保持程序的安全性和可靠性。

什么是 strncat?

strncat 函数将一个字符串中的指定数量的字符连接到另一个字符串。它声明在 string.h 中,并接受三个参数:目标字符串、源字符串和要复制的最大字节数。strncatstrcat 更安全,因为它限制了复制的字符数。它始终以 null 终止结果,使其成为安全编码实践的首选。

基本 strncat 用法

此示例演示了使用 strncat 进行基本字符串连接。

basic_concat.c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello";
    char src[] = ", World!";

    // Concatenate first 7 characters from src
    strncat(dest, src, 7);

    printf("Result: %s\n", dest);
    printf("Destination length: %zu\n", strlen(dest));

    return 0;
}

在这里,strncatsrc 中的最多 7 个字符追加到 dest。目标缓冲区必须有足够的空间来容纳结果。与 strcat 不同,如果正确调整大小,strncat 不会溢出目标。始终确保目标有空间容纳新字符和 null 终止符。

防止缓冲区溢出

此示例显示了 strncatstrcat 相比如何防止缓冲区溢出。

safe_concat.c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[10] = "Hello";
    char src[] = "World! This is too long";

    // Safe concatenation with length limit
    strncat(dest, src, sizeof(dest) - strlen(dest) - 1);

    printf("Safe result: %s\n", dest);

    return 0;
}

此代码安全地将连接限制在 dest 的剩余空间内。计算 sizeof(dest) - strlen(dest) - 1 确保为 null 终止符留有空间。与 strcat 不同,即使源太大,这也不会溢出缓冲区。此模式对于 C 程序中的安全字符串处理至关重要。

连接部分字符串

此示例演示了源字符串部分的选择性连接。

partial_concat.c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[30] = "Colors: ";
    char src[] = "Red, Green, Blue, Yellow";

    // Concatenate only first 3 colors
    strncat(dest, src, 13);

    printf("Selected colors: %s\n", dest);

    return 0;
}

在这里,strncat 仅复制 src 的前 13 个字符,结果是“Colors: Red, Green, B”。这表明 strncat 如何提取字符串的一部分。计数参数提供了对要追加数据的精确控制。始终验证目标是否有足够的空间来容纳所选部分。

多次连接

此示例显示了使用 strncat 进行多次安全连接。

multi_concat.c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[50] = "User: ";
    char name[] = "John Doe";
    char role[] = " (Administrator)";
    char email[] = " - johndoe@example.com";

    // Safe multiple concatenations
    strncat(dest, name, sizeof(dest) - strlen(dest) - 1);
    strncat(dest, role, sizeof(dest) - strlen(dest) - 1);
    strncat(dest, email, sizeof(dest) - strlen(dest) - 1);

    printf("User info: %s\n", dest);

    return 0;
}

此代码使用 strncat 安全地将多个组件构建为一个字符串。每次调用都会检查剩余空间以防止溢出。模式 sizeof(dest) - strlen(dest) - 1 会在每次连接时重复。当从多个源构建字符串时,这种方法比使用 strcat 更安全。结果始终以 null 终止。

处理空目标

此示例演示了 strncat 与空目标的行为。

empty_concat.c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "";  // Empty string
    char src[] = "Initial content";

    // Concatenate to empty destination
    strncat(dest, src, sizeof(dest) - 1);

    printf("Result: %s\n", dest);
    printf("Length: %zu\n", strlen(dest));

    return 0;
}

当目标为空时,strncat 的行为类似于有界复制。该示例显示了字符串缓冲区的安全初始化。即使源很大,大小限制也能确保不会发生溢出。此模式对于使用默认内容初始化缓冲区很有用。结果始终是一个有效的以 null 终止的字符串。

使用 strncat 的最佳实践

来源

C strncat 文档

本教程从基本用法到安全编程模式,探讨了 strncat 函数。通过使用 strncat 而不是 strcat,您可以防止缓冲区溢出,并创建更健壮的 C 程序。

作者

我叫 Jan Bodnar,是一名敬业的程序员,对编码充满热情。自 2007 年以来,我通过 1,400 多篇文章和 8 本电子书分享了我的专业知识。凭借十多年的教学经验,我努力使编程易于理解且引人入胜。

列表 C 标准库