在下面的代码中,我尝试为每个乐队获取乐队成员的数量。我已经尝试了很多方法,但是没有任何效果。以下内容看起来应该但不应该。
如果有人指出我做错了,将不胜感激。
numMembers = sizeof(bands[0]) / sizeof(bands[0].members);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int i;
int j;
int numBands;
int numMembers;
int limit = 4;
struct band {
char name[10];
char *members[20];
};
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"} } };
numBands = sizeof(bands) / sizeof(bands[0]);
for ( i = 0; i < numBands; ++i ) {
printf ("%s\n", bands[i].name);
numMembers = sizeof(bands[0]) / sizeof(bands[0].members);
for ( j = 0; j < numMembers; ++j )
printf ("\t%s", bands[i].members[j]);
printf ("\n");
}
return 0;
}
答案 0 :(得分:1)
我做错了什么
numMembers
计算错误
numMembers
应该是数组中元素的数量。 (20)
每个bands[i].member
都给定char *members[20]
有20个元素。用指向 string文字的指针填充了几个元素。大多数元素保持为0(NULL
)。
// numMembers = sizeof(bands[0]) / sizeof(bands[0].members);
numMembers = sizeof(bands[0].members) / sizeof(bands[0].members[0]);
尝试将NULL
打印为字符串
printf ("\t%s", bands[i].members[j]);
在bands[i].members[j]
为NULL
时无效。
并非所有bands[i].members[j]
都设置为非NULL
值。
numBands = sizeof(bands) / sizeof(bands[0]);
for ( i = 0; i < numBands; ++i ) {
printf ("%s\n", bands[i].name);
numMembers = sizeof(bands[i].members) / sizeof(bands[i].members[0]);
for ( j = 0; j < numMembers; ++j ) {
if (bands[i].members[j]) {
printf ("\t%s", bands[i].members[j]);
}
}
printf ("\n");
}
}
更深:
const struct band bands[] = { {"Beatles", ...
的格式为bands
,尺寸为bands[]
,具体取决于初始化程序的数量。
char *members[20];
是固定大小的,即使初始化未提供20个 strings 。每个列表将初始化第一个元素members[20]
,其余元素的指针值为0。
答案 1 :(得分:1)
您没有“二维数组”。您拥有的是一个简单的数组 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');
}
}
(请注意,添加了j < 20
,正如@chux在评论中指出的那样,仅测试while (bands[i].members[j])
可能导致未定义行为是在初始化后bands
添加了额外的乐队,并且20
结构成员的所有members
指针都已填充)
使用/输出示例
$ ./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];
};
随着代码长度的增加,这对于可维护性非常重要。
答案 2 :(得分:0)
对于numMembers = sizeof(bands [0] .members); sizeof(bands [0] .members);
sizeofband(bands [0])将给出一个band结构的大小-名称为10个字节,然后为指针的大小20 *。
sizeof(bands [0] .members);将给出指针的20 * thesize
不是您想要的,因为sizeof并未考虑指针指向的内容。
它也没有考虑到某些成员指针将为NULL,因此您不想对其进行计数。
也许做得更好:
- node_modules
-- B
--- index.js
- __mocks__
-- B.js