为什么 'strcat' 函数不起作用?

Why isn't the 'strcat' function working?

我正在尝试使用 strcat 连接结构中的数组。我的代码如下所示:

int main(){

//Implementation of Search table Tree

struct searchTable
{
    char first[10];
    int first_id;
    char second[10];
    int second_id;
    char third[10];
    int third_id;
    char fourth[10];
    int fourth_id;
    char fifth[10];
    int fifth_id;

}input[5]= {
        {"ABC", 101},
        {"CAB",102},
        {"ACB",103},
        {"AAC",104},
        {"CCB",105}
};
char join[100]={0};

strcat(join, input[0].first);
strcat(join, input[1].second);
strcat(join, input[2].third);
strcat(join, input[3].fourth);
strcat(join, input[4].fifth);

printf("%s", join);

这里是输出,而不是给我

ABCCABACBAACCCB

给我

ABC

有人能告诉我我做错了什么吗?

这里的问题是,在定义时初始化时,您只初始化了每个 input[n] 元素的前两个成员变量(检查提供的初始化程序的数量)。所以,后来,在做

strcat(join, input[1].second);
strcat(join, input[2].third);
strcat(join, input[3].fourth);
strcat(join, input[4].fifth);

secondthirdfourthfifth 元素的所有 input[n] 成员变量都初始化为 0 或 null-指针,因为数组定义是全局的。

输出正确,这是此代码的预期输出。


话虽如此,main() 的推荐签名是 int main(int argc, char *argv[]) 或至少 int main(void)

您的初始化程序并未涵盖 struct searchTable 的所有成员,仅涵盖 input 数组每个元素的前两个成员。其他的都隐含地用零初始化。这样:

strcat(join, input[1].second);
strcat(join, input[2].third);
...

与空字符串连接,因为所有这些都被视为零长度,因为它们以 '[=14=]'(或 ASCII 中的 NUL)开头 空字符。换句话说:

strlen(input[1].second) == 0
strlen(input[2].third) == 0
...

改写

strcat(join, input[0].first);
strcat(join, input[1].first);
strcat(join, input[2].first);
strcat(join, input[3].first);
strcat(join, input[4].first);

使用这些初始化器

//...
}input[5]= {
        {"ABC", 101},
        {"CAB",102},
        {"ACB",103},
        {"AAC",104},
        {"CCB",105}
};

您只显式初始化了数组每个元素的前两个数据成员,即 firstfirst_id。所有其他数据成员都被零初始化。

如果你想使用 strcat

strcat(join, input[0].first);
strcat(join, input[1].second);
strcat(join, input[2].third);
strcat(join, input[3].fourth);
strcat(join, input[4].fifth);

然后按照下面的方式初始化数组

struct searchTable
{
    char first[10];
    int first_id;
    char second[10];
    int second_id;
    char third[10];
    int third_id;
    char fourth[10];
    int fourth_id;
    char fifth[10];
    int fifth_id;

}input[5]= {
        { .first = "ABC", .first_id = 101 },
        { .second = "CAB", .second_id = 102 },
        { .third = "ACB", .third_id = 103 },
        { .fourth = "AAC", .fourth_id = 104 },
        { .fifth = "CCB", .fifth_id = 105 }
};

在这种情况下,输出将类似于

ABCCABACBAACCCB
input[5]= {
        {"ABC", 101},
        {"CAB",102},
        {"ACB",103},
        {"AAC",104},
        {"CCB",105}
};

您总是在初始化前两个成员。 i.e first and first_id

所以请首先将所有内容替换为输入[0]。这肯定会起作用。

Happy Coding !!!!!!!

您被声明为具有十个成员的结构

struct searchTable
{
    char first[10];
    int first_id;
    char second[10];
    int second_id;
    char third[10];
    int third_id;
    char fourth[10];
    int fourth_id;
    char fifth[10];
    int fifth_id;
}

在分配值时,您提到了两个值,因此将分配前两个值。其余变量将为空。

strcat(join, input[1].second);
strcat(join, input[2].third);
strcat(join, input[3].fourth);
strcat(join, input[4].fifth);

如果你这样做,你会得到这个输出,正如你预期的那样。

    strcat(join, input[0].first);
    strcat(join, input[1].first);
    strcat(join, input[2].first);
    strcat(join, input[3].first);
    strcat(join, input[4].first);