У вас нет "двумерного массива". У вас есть простой массив struct band
, который содержит два простых символьных массива в качестве своих членов.
Нет необходимости вычислять количество "members"
в каждой полосе. Все, что вам нужно для вычисления, это число bands
, например
int nbands = sizeof bands / sizeof *bands;
Поскольку вы объявили members
как массив указателей и использовали инициализатор для инициализации первых четырех, оставшиеся указатели будут иметь все установленные байты 0
, в результате чего каждое будет NULL
, Вы можете просто выполнить цикл для members
с while (bands[i].members[j])
, увеличивая j
каждую итерацию, например
#include <stdio.h>
struct band {
char name[10];
char *members[20];
};
int main(void) {
const struct band bands[] = {
{"Beatles", {"John", "George", "Paul", "Ringo", "Pete", "George"} },
{"Stones", {"Mick", "Keith", "Bill", "Charlie", "Brian"} },
{"Who", {"Pete", "Roger", "Keith", "John"} },
{"JHE", {"Jimmy", "Noel", "Mitch"} } };
int nbands = sizeof bands / sizeof *bands;
for (int i = 0; i < nbands; i++) {
int j = 0;
puts (bands[i].name);
while (j < 20 && bands[i].members[j])
printf (" %s", bands[i].members[j++]);
putchar ('\n');
}
}
( note добавление j < 20
, которое, как указал @chux в комментариях, только тест while (bands[i].members[j])
может привести к неопределенному поведению в случае добавления дополнительных полос bands
после инициализации и все 20
указатели члена members
struct были заполнены)
Пример использования / Вывод
$ ./bin/bandmembers
Beatles
John George Paul Ringo Pete George
Stones
Mick Keith Bill Charlie Brian
Who
Pete Roger Keith John
JHE
Jimmy Noel Mitch
Кроме того, не используйте магические числа в своем коде. Вместо этого, если вам нужна постоянная, #define
один (или более), например,
#define MAXNM 10
#define MAXMB 20
или используйте глобальный enum
, чтобы сделать то же самое, например,
enum { MAXNM = 10, MAXMB = 20 };
Это позволит вам устранить магические числа , например,
struct band {
char name[MAXNM];
char *members[MAXMB];
};
Это становится очень важным для удобства обслуживания при увеличении длины кода.