C 字符串拼接

在 C 语言中,如果想要将两个字符串拼接成一个字符串,我们可以使用以下 4 种函数来实现。

  • strcat()
  • strncat()
  • sprintf()
  • snprintf()

提示:

  • strcat() 和 strncat() 是 <string.h> 标准库的函数。
  • sprintf() 和 snprintf() 是 <stdio.h> 标准库的函数。

使用 strcat() 拼接字符串

在 C 语言中,我们可以使用 strcat() 函数来将两个字符串拼接成一个字符串。strcat(),是 “string concatenate(字符串连接)” 的缩写。

语法:

strcat(str1, str2)

说明:

strcat(str1, str2) 表示将 str2 合并到 str1 中。也就是说,最后 str1 会被修改。

注意: 使用 strcat() 函数时,我们必须确保 str1 指向的内存空间足够能够容纳拼接后的字符串(包括结尾的空字符 '\0')。如果 str1 的空间不足,可能会发生缓冲区溢出,然后导致程序崩溃或安全漏洞。

示例 1:使用 strcat() 函数

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

int main(void)
{
    char a[20] = "Go";
    char b[] = "Python";

    strcat(a, b);
    puts(a);
    puts(b);

    return 0;
}

运行结果如下。

GoPython
Python

分析:

从结果可以看出来,strcat(a, b) 会修改第 1 个字符串,但不会修改第 2 个字符串。

需要注意的是,这里我们特意将 a 定义为 char a[20] = "Go";,这样做的目的是为了确保 a 有足够的空间来存储拼接后的 "GoPython" 字符串。

如果你不希望修改原字符串,可以先使用 strcpy() 函数将原字符串复制一份,然后再使用 strcat() 函数进行拼接。

示例 2:使用 strcpy() + strcat()

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

int main(void)
{
    char a[20] = "Go";
    char b[] = "Python";
    char temp[10];

    // 复制字符串a
    strcpy(temp, a);
    // 拼接字符串
    strcat(temp, b);

    // 打印结果
    puts(a);
    puts(b);
    puts(temp);

    return 0;
}

运行结果如下。

Go
Python
GoPython

使用 strncat() 拼接字符串

在 C 语言中,我们还可以使用 strncat() 函数来将两个字符串拼接成一个字符串。相比于 strcat() 函数,strncat() 函数可以指定要追加的字符数,从而降低缓冲区溢出的风险。

语法:

strcat(str1, str2, n)

说明:

strncat(str1, str2, n) 表示将 str2 追加到 str1 的末尾,不过只会追加 str2 的前 n 个字符。

注意: 即使使用了 strncat() 函数,仍然需要确保 str1 指向的内存空间能够足够容纳拼接后的字符串(包括结尾的空字符 '\0')。strncat() 会在 str1 的末尾添加一个空字符,即使追加的字符数达到了 n。

示例 3:使用 strncat() 函数

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

int main(void)
{
    char a[20] = "Go";
    char b[] = "Python";

    strncat(a, b, 2);
    puts(a);
    puts(b);

    return 0;
}

运行结果如下。

GoPy
Python

分析:

从结果可以看出,strncat(a, b, n) 会修改第 1 个字符串,但不会修改第 2 个字符串,并且只追加了 b 的前 2 个字符。

使用 sprintf() 拼接字符串

在 C 语言中,我们可以使用 sprintf() 函数来将 “格式化好的字符串” 写入到指定的字符数组中。

其中,sprintf 是 “string print format(字符串输出格式化)” 的简写。

语法:

sprintf(str, format, str1, str2, ... strN)

说明:

sprintf() 函数接收以下 3 种参数。

  • str:用于保存结果。
  • format:是预定义好的格式。
  • str,str2...strN:是需要拼接的多个字符串。

sprintf(str, format, str1, str2, ... strN) 其实很好理解,它表示将 str1, str2, ... strN 按照 format 个格式拼接好,然后保存到 str 中去。

注意: 与 strcat() 类似,使用 sprintf() 时也需要注意缓冲区溢出的问题。如果格式化后的字符串长度超过了 str 的容量,可能会导致内存错误。

示例 4:使用 sprintf() 函数

#include <stdio.h>

int main(void)
{
    char str[100];

    sprintf(str, "%s**%s**%s", "C", "Python", "Go");
    puts(str);
    return 0;
}

运行结果如下。

C**Python**Go

使用 snprintf() 拼接字符串

在 C 语言中,我们可以使用 snprintf() 函数来将 “格式化好的字符串” 写入到指定的字符数组中。

相比于 sprintf() 函数,snprintf() 函数可以指定目标缓冲区的大小,从而提供更强的安全性,防止缓冲区溢出。

语法:

snprintf(str, n, format, str1, str2, ... strN)

说明:

snprintf() 函数接收以下 4 种参数。

  • str:用于保存结果。
  • n:指定 str 缓冲区的大小(包括结尾的空字符)。
  • format:是预定义好的格式字符串。
  • str, str2, ..., strN:是需要拼接的多个字符串。

snprintf(str, format, str1, str2, ... strN) 其实很好理解,它表示将 str1, str2, ... strN 按照 format 个格式拼接好,然后保存到 str 中去。但最多只会写入 n - 1 个字符,并在末尾添加一个空字符 '\0'。

示例 5:使用 snprintf() 函数

#include <stdio.h>
int main(void)
{
    char str[100];

    snprintf(str, sizeof(str), "%s**%s**%s", "C", "Python", "Go");
    puts(str);
    return 0;
}

运行结果如下。

C**Python**Go

分析:

在上面例子中,我们使用了 sizeof(str) 来获取 str 缓冲区的大小,并将其传递给 snprintf(),确保不会发生缓冲区溢出。

最后需要说明的是,在进行字符串拼接时,我们推荐优先使用 snprintf() 函数,因为它提供了更好的安全性。对于简单的字符串追加,如果能确保目标缓冲区足够大,我们可以使用 strncat() 并指定追加的最大长度。小伙伴们应该尽量避免使用 strcat() 和 sprintf(),除非你能完全控制输入和输出的长度,以防止缓冲区溢出。

上一篇: C 字符串长度

下一篇: C 字符串比较

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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