ZetCode

C strcat_s 函数

最后修改:2025 年 4 月 8 日

字符串操作在 C 编程中至关重要,而 strcat_s 是安全连接字符串的关键函数。本教程将深入介绍 strcat_s,包括其语法、用法以及相较于 strcat 的优势。我们将探讨实际示例,并讨论为什么安全字符串函数在现代 C 编程中如此重要。了解 strcat_s 有助于防止缓冲区溢出和其他安全漏洞。

什么是 strcat_s?

strcat_s 函数通过将源字符串的副本追加到目标字符串来安全地连接两个字符串。它在 string.h 中声明,并接受四个参数:目标指针、目标大小、源指针以及可选的要追加的字符数。strcat_s 执行边界检查以防止缓冲区溢出。对于安全关键型代码,请始终优先使用 strcat_s 而非不安全的 strcat 函数。

strcat_s 的基本用法

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

basic_concat.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello";
    char src[] = ", World!";
    
    // Safe concatenation
    strcat_s(dest, sizeof(dest), src);

    printf("Result: %s\n", dest);
    return 0;
}

在这里,strcat_s 安全地将 src 追加到 dest。第二个参数指定了目标缓冲区的总大小。该函数确保操作不会超出缓冲区的容量。这可以防止使用 strcat 时可能发生的缓冲区溢出。在计算缓冲区大小时,请始终包含 null 终止符。

处理缓冲区溢出

此示例展示了 strcat_s 如何防止缓冲区溢出。

overflow_prevention.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    char dest[10] = "Hello";
    char src[] = ", this is too long!";
    
    // Attempt safe concatenation
    errno_t result = strcat_s(dest, sizeof(dest), src);

    if (result != 0) {
        printf("Error: Buffer too small (code %d)\n", result);
        return 1;
    }

    printf("Result: %s\n", dest);
    return 0;
}

此代码演示了 strcat_s 的边界检查功能。目标缓冲区对于源字符串来说太小,因此函数会返回错误而不是导致缓冲区溢出。错误代码有助于识别具体的故障原因。这种行为使得 strcat_s 在生产代码中比 strcat 安全得多。

连接多个字符串

此示例展示了如何安全地连接多个字符串。

multi_concat.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    char dest[50] = "The";
    char part1[] = " quick";
    char part2[] = " brown";
    char part3[] = " fox";
    
    // Chain multiple safe concatenations
    strcat_s(dest, sizeof(dest), part1);
    strcat_s(dest, sizeof(dest), part2);
    strcat_s(dest, sizeof(dest), part3);

    printf("Result: %s\n", dest);
    return 0;
}

此示例通过多次连接安全地构建一个更长的字符串。每次调用 strcat_s 都会检查剩余的缓冲区空间。目标缓冲区必须足够大以容纳所有连接的字符串。当从组件构建复杂字符串时,这种模式很常见。请务必验证总长度不会超出目标容量。

部分字符串连接

此示例演示了仅连接源字符串的一部分。

partial_concat.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    char dest[30] = "Selected: ";
    char src[] = "Apples,Oranges,Bananas";
    
    // Concatenate only first 6 chars of src
    strcat_s(dest, sizeof(dest), src, 6);

    printf("Result: %s\n", dest);
    return 0;
}

在这里,strcat_s 仅追加 src 的前 6 个字符。第四个参数指定了要追加的最大字符数。当需要连接子字符串时,这非常有用。该函数仍然对目标缓冲区执行边界检查。这在字符串操作中提供了安全性和灵活性。

构建路径字符串

此示例展示了构建文件路径的实际用例。

path_builder.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    char path[256] = "C:\\Program Files\\";
    char app[] = "MyApplication";
    char subdir[] = "\\config\\";
    char file[] = "settings.ini";
    
    // Build path safely
    strcat_s(path, sizeof(path), app);
    strcat_s(path, sizeof(path), subdir);
    strcat_s(path, sizeof(path), file);

    printf("Full path: %s\n", path);
    return 0;
}

此代码使用 strcat_s 从组件构建完整的文件路径。每个部分都经过边界检查安全地追加。目标缓冲区的大小足以容纳预期的最大路径长度。这种模式在文件操作和配置管理中很常见。构建路径时,请始终使用安全连接来防止安全问题。

使用 strcat_s 的最佳实践

来源

C strcat_s 文档

本教程从基本用法到实际应用,探讨了 strcat_s 函数。安全地处理字符串对于编写能够抵抗缓冲区溢出漏洞和未定义行为的健壮 C 程序至关重要。

作者

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

列表 C 标准库