为什么不是' strcat'功能有效吗?

时间:2015-07-20 11:29:26

标签: c string strcat

我正在尝试使用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

有人可以告诉我我做错了吗?

5 个答案:

答案 0 :(得分:6)

改为写

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

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分:3)

您被宣布为具有十名成员的结构

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;
}

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

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);

答案 3 :(得分:2)

您的初始值设定项不会涵盖struct searchTable的所有成员,只会覆盖input数组的每个元素的前两个成员。其他人用隐含的零初始化。那样:

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

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

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

答案 4 :(得分:2)

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

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

所以用输入[0] .first替换all。这肯定会有效。

  

快乐编码!!!!!!!