C

时间:2015-11-28 13:53:43

标签: c arrays string char

我想用C语言迭代下面的2d字符串数组;这是迭代的代码:

char list [][] ={{"dan","1"},{"sara","2"},{"loura","3"}};

for(i=0; i < 3;i++){

    for(j=0; j < 2;j++){

        if(strcmp(list[i][0],data)==0)
        {
            /*some code*/              
        }

    }//end column 


}// end row for

我收到很多警告,例如&#34;数组类型的元素类型不完整&#34;。 我认为问题出在2d数组中。我尝试了其他初始化方式,如:

 char **list[][]=......

但这也没有奏效。

3 个答案:

答案 0 :(得分:1)

你应该像这样声明它

char list[][2][6] = {{"dan", "1"}, {"sara", "2"}, {"loura", "3"}};
  1. 它是一组字符阵列数组。所以是一个3D char数组。您只有2对[]
  2. 您必须指定除第一个维度以外的所有维度。说char[3][2][6]也不会有害。
  3. 最后一个尺寸&#34; 6&#34;是最长字符串"loura"加上空终止char
  4. 的大小

答案 1 :(得分:1)

if(strcmp(list[i][0],data)==0)

应该是

if(strcmp(list[i],data)==0)

您需要字符串的地址,而不是第一个元素。

答案 2 :(得分:1)

根据你的评论,数组永远不会改变,你应该让它保持不变。还可以使用指向条目的指针。后者避免了提供最大值的需要。每个字符的大小&#34;字符串&#34;并避免空间缩小:

const char * const list[][2] = { { "...", "..." } , ... };

这是指向char的2D数组。初始化器将设置指向初始化程序中给出的字符串文字的指针。这是您可以获得的最舒适(在自动内存空间大小的意义上)。编译器可以通过初始化器中的对数推导出外(最左边!)维。对于内部维度,您必须指定。字符串文字的大小与数组无关,因为我们使用指针(数据不存储在数组本身中)。

第一个const告诉编译器指向的对象不会被修改。第二个对指针本身说明相同(这意味着整个数组不会被修改)。

有了这个,您可以在问题中使用strcmp

strcmp(list[i][0], data)

确保data 始终正确终止(即最后为'\0')。

更新:根据您的编辑,您希望以数字形式访问第二个条目。也许整数会比字符串更好。为此,您需要一个struct的一维数组:

const struct {
    const char *name;
    int number;
} list[] = { { .name = "name", .number = 15 } , ... };

.name = / .number =部分被指定为初始化者;自C99起为标准。)

用法:

strcmp(list[i].name, data)
int my_number = list[i].number;

这样您可以更轻松地处理整数部分,并且您可以更轻松地命名两个条目。即使你仍然使用两个字符串,这可能是更好的方法,因为只有当所有条目具有相同的语义时才应该使用数组,否则struct会更合适。