具有c中的char指针的二维数组

时间:2018-11-07 21:54:10

标签: c arrays pointers struct char

在下面的代码中,我尝试为每个乐队获取乐队成员的数量。我已经尝试了很多方法,但是没有任何效果。以下内容看起来应该但不应该。

如果有人指出我做错了,将不胜感激。

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

3 个答案:

答案 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