首页 > 解决方案 > c中带有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;
}

标签: carrayspointersstructchar

解决方案


我做错了什么

numMembers计算错误

numMembers应该是数组中元素的数量。(20)

每个bands[i].member都有 20 个给定的元素char *members[20]。几个元素填充了指向字符串文字的指针。大多数元素保持为 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 个字符串也是固定大小。第一个元素members[20]根据列表进行初始化,其余元素的指针值为 0。


推荐阅读