geekdoc-python-zh/docs/overiq/062.md

3.6 KiB
Raw Permalink Blame History

C 语言中的strcat()函数

原文:https://overiq.com/c-programming-101/the-strcat-function-in-c/

最后更新于 2020 年 7 月 27 日


strcat()函数的语法是:

语法: char* strcat (char* strg1, const char* strg2);

该函数用于连接两个字符串。该函数接受两个指向char(char*)的类型指针参数,因此您可以传递字符串或字符数组。删除第一个字符串中的空字符,然后在第一个字符串的末尾追加第二个字符串。它返回一个指向结果字符串(strg1)的指针。一般情况下strcat()的返回值会被丢弃。

以下是一些例子:

char strg1[40] = "Hello";

/*
returns a pointer (which is discarded) to the string literal
"Hello World" and now strg1 contains "Hello World"
*/
strcat(strg1, " World");

/* 
returns a pointer (which is discarded) to the string
to "Hello World :)" and now strg1 contains "Hello World :)"
*/
strcat(strg1, " :)");

您不应该将字符串作为第一个参数传递,因为如果您这样做了,那么strcat()函数将试图修改字符串,这是一种未定义的行为,可能会导致程序崩溃。

strcat("Yello", " World"); // wrong

strg1指向的数组的大小不足以容纳来自strg2的所有字符时,strcat()的行为是未定义的。程序员的责任是确保strg1指向的数组的大小足够长,可以容纳所有来自strg2的字符。

下面的程序演示了如何使用strcat()功能。

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

int main()
{
    char strg1[40];
    char strg2[40];

    printf("Enter first string: ");
    gets(strg1);

    printf("Enter second string: ");
    gets(strg2);

    printf("\nConcatenating first and second string .. \n\n");
    strcat(strg1, strg2);

    printf("First string: %s\n", strg1);
    printf("Second string: %s", strg2);

    // signal to operating system program ran fine
    return 0;
}

预期输出:

Enter first string: top
Enter second string: pot

Concatenating first and second string ..

First string: toppot
Second string: pot

让我们创建自己版本的strcat()函数。

char *my_strcat(char *strg1, char *strg2)
{
    char *start = strg1;

    while(*strg1 != '\0')
    {
        strg1++;
    }

    while(*strg2 != '\0')
    {
        *strg1 = *strg2;
        strg1++;
        strg2++;
    }

    *strg1 = '\0';
    return start;
}

工作原理:

my_strcat()函数接受指向char(char*)的类型指针的两个参数,并返回指向第一个字符串即strg1的指针。

在第 3 行中,我们已经将指针strg1分配给了start,这一步是必要的,否则我们将失去对第一个字符串(strg1)开头的地址的跟踪。

第一个 while 循环的工作是将指针strg1移动到最后一个字符,即'\0'。以便第二个 while 循环可以在这个位置开始追加字符。

第二个 while 循环将第二个字符串中的字符逐个追加到第一个字符串中。因为在第一个 while 循环之后strg1指向第一个字符串的空字符,所以在第一次迭代中,语句:

*strg1 = *strg2;

将第二个字符串中的第一个字符追加到第一个字符串的末尾(即代替空字符'\0')。然后strg1++strg2++递增。这个过程一直重复,直到在第二个字符串中遇到空字符(strg2)。

此时start 指向的字符串仍然缺少一个东西,空字符('\0')。该声明:

*strg1 = '\0';

在第一个字符串的末尾追加空字符。

最后,return语句将指向第一个字符串的指针返回给调用函数。