我想用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[][]=......
但这也没有奏效。
答案 0 :(得分:1)
你应该像这样声明它
char list[][2][6] = {{"dan", "1"}, {"sara", "2"}, {"loura", "3"}};
char
数组。您只有2对[]
。char[3][2][6]
也不会有害。"loura"
加上空终止char
答案 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
会更合适。