ZetCode

C strcat 函数

最后修改:2025 年 4 月 8 日

字符串操作在 C 编程中是基础性的,而 strcat 是用于连接字符串的关键函数。本教程将深入探讨 strcat,包括其语法、用法和潜在的陷阱。我们将通过实际示例进行探讨,并为关键应用程序讨论更安全的替代方法。理解 strcat 有助于在维护程序安全性和可靠性的同时操作字符串。

什么是 strcat?

strcat 函数将一个字符串连接(追加)到另一个字符串。它在 string.h 中声明,并接受两个参数:目标字符串和源字符串。strcat 将源字符串追加到目标字符串,覆盖其空终止符。目标缓冲区必须有足够的空间容纳组合后的字符串。对于安全关键代码,请考虑使用 strncat 进行边界检查的连接。

strcat 的基本用法

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

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

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

    // Concatenate src to dest
    strcat(dest, src);

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

    return 0;
}

在此,strcatsrc 追加到 dest,结果为“Hello, World!”。目标缓冲区必须足够大以容纳两个字符串。当您知道所需的确切大小时,这是合并字符串的简单方法。始终确保目标有足够的空间以防止缓冲区溢出。

连接多个字符串

strcat 可以多次用于构建复杂的字符串,如本示例所示。

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

int main() {
    char sentence[100] = "The ";
    char adj[] = "quick ";
    char noun[] = "brown fox ";
    char verb[] = "jumps over ";

    // Build the sentence piece by piece
    strcat(sentence, adj);
    strcat(sentence, noun);
    strcat(sentence, verb);
    strcat(sentence, "the lazy dog.");

    printf("%s\n", sentence);

    return 0;
}

此示例通过连接多个字符串来构建一个句子。每次调用 strcat 都会将另一部分追加到不断增长的字符串中。目标缓冲区必须容纳最终的组合长度。此技术对于从组件构建动态字符串很有用。在使用多个连接时,请始终验证缓冲区大小。

潜在的缓冲区溢出

此示例演示了在没有适当边界检查的情况下使用 strcat 的危险。

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

int main() {
    char dest[10] = "Hello";
    char src[] = ", World! This is too long!";
    
    // Unsafe concatenation - buffer overflow
    strcat(dest, src);

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

    return 0;
}

此代码会导致未定义的行为,因为 dest 对于组合后的字符串来说太小了。strcat 不会检查缓冲区大小,并将写入超出 dest 的末尾。在这种情况下,应改用 strncat,因为它限制了复制的字符数。缓冲区溢出可能导致崩溃或安全漏洞。

安全替代方案:strncat

此示例演示了更安全的 strncat 函数。

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

int main() {
    char dest[20] = "Hello";
    char src[] = ", World! This is too long!";
    
    // Safe concatenation with bounds checking
    strncat(dest, src, sizeof(dest) - strlen(dest) - 1);

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

    return 0;
}

strncat 增加了边界检查并限制了复制的字符数。第三个参数指定要追加的最大字符数。我们通过从缓冲区大小减去当前长度来计算可用空间。这有助于防止缓冲区溢出。在计算中始终包含空终止符的空间。

使用 strcat 构建路径

此示例展示了如何使用 strcat 构建文件路径。

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

int main() {
    char path[256] = "/home/user/";
    char dir[] = "documents/";
    char file[] = "report.txt";

    // Build the complete path
    strcat(path, dir);
    strcat(path, file);

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

    return 0;
}

在这里,strcat 用于从组件构建完整的文件路径。目标缓冲区必须足够大以容纳最终路径。此技术在文件操作中很常见。构建路径时,请考虑使用特定于平台的路径分隔符。始终将最终路径长度与缓冲区大小进行验证。

使用 strcat 的最佳实践

来源

C strcat 文档

本教程探讨了 strcat 函数,从基本用法到高级注意事项。虽然方便,但请始终谨慎使用字符串操作,以防止程序中的安全漏洞和未定义行为。

作者

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

列表 C 标准库