2015-07-20 2 views
3

Я пытаюсь объединить массивы из структуры, используя 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

Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Просто спрашивайте, есть ли у вас 'string.h'? –

+0

@SouravGhosh: Да. У меня есть string.h и stdio.h включено – Goldengirl

ответ

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

явно инициализированы только первые два элемента данных каждого элемента массива, который first и first_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 
+0

Спасибо за помощь. Мне было интересно, могу ли я реализовать это с помощью цикла for? Это возможно? – Goldengirl

+0

@Goldengirl Я не представляю, как это можно сделать с элементами данных структуры, определенными как показано в вашем примере. –

+0

@ Goldengirl Возможно, вам стоит задать новый вопрос. –

4

Проблема в том, что при инициализации во время определения вы только инициализируете первые две переменные-члены каждого элемента input[n] (проверьте количество поставляемых инициализаторов). Таким образом, позже, при этом

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

всех переменных-членов в second, third, fourth и fifth для input[n] элементов инициализируются 0 или нуль-указатель, как определение массива является глобальным.

Выход правильный и это ожидаемый выход для этого кода.


Сказав, что рекомендуемое подпись main() является int main(int argc, char *argv[]) или, по крайней мере, int main(void).

2

Ваш инициализатор не охватывает всех членов struct searchTable, только первые два элемента для каждого элемента массива input. Остальные инициализируются нулями неявно. Таким образом:

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

конкатенации с пустыми строками, так как все они рассматриваются как нулевой длины, потому что они начинают с '\0' (или NUL в ASCII) нулевой символ. Другими словами:

strlen(input[1].second) == 0 
strlen(input[2].third) == 0 
... 
2
input[5]= { 
     {"ABC", 101}, 
     {"CAB",102}, 
     {"ACB",103}, 
     {"AAC",104}, 
     {"CCB",105} 
}; 

Вы всегда инициализируете первые два члена. i.e first and first_id

так что замените все на вход [0] .первый. это будет работать точно.

Happy Coding !!!!!!!

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

При назначении значения вы упоминаете эти два значения, поэтому первые два значения будут назначены. Остальные переменные будут пустыми.

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

"Если вы это сделаете, вы получите этот результат, как и вы ожидали. _" - Нет. –

Смежные вопросы