C语言中的二维字符串数组

C语言中的二维字符串数组,c,arrays,string,char,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*/ } }//e

我想用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

但这也不起作用

你应该这样声明

char list[][2][6] = {{"dan", "1"}, {"sara", "2"}, {"loura", "3"}};
这是一个字符数组数组。所以一个3D字符数组。您只有两对[]。 必须指定除第一个尺寸标注以外的所有尺寸标注。说char[3][2][6]也没什么坏处。 最后一个大小6是最长字符串loura加上null终止字符的大小
你应该这样申报

char list[][2][6] = {{"dan", "1"}, {"sara", "2"}, {"loura", "3"}};
这是一个字符数组数组。所以一个3D字符数组。您只有两对[]。 必须指定除第一个尺寸标注以外的所有尺寸标注。说char[3][2][6]也没什么坏处。 最后一个大小6是最长字符串loura加上null终止字符的大小 如果strcplist[i][0],则数据==0

应该是

if(strcmp(list[i],data)==0)
您需要的是字符串的地址,而不是第一个元素。

ifstrcplist[i][0],data==0

应该是

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

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

根据您的注释,数组永远不会更改,您应该将其设置为常量。还可以使用指向条目的指针。后者避免了提供每个字符串的最大字符大小,并避免了腰围空间:

const char * const list[][2] = { { "...", "..." } , ... };
这是指向char的指针的2D数组。初始化器将设置指向初始化器中给定的字符串文本的指针。从自动调整内存空间大小的角度来看,这是最舒适的。编译器可以推断最左边的外部!按初始值设定器中的对数进行标注。对于内部尺寸标注,必须指定。字符串文本的大小与数组无关,因为我们使用指针,数据不存储在数组本身中

第一个常量告诉编译器指向的对象不会被修改。第二个指针本身也是如此,这意味着整个数组不会被修改

有了这个,您可以像在问题中一样使用strcmp:

strcmp(list[i][0], data)
确保数据始终正确终止,即结尾为“\0”

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

.name=/.number=部分是指定的初始化器;自C99以来的标准

用法:

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

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

根据您的注释,数组永远不会更改,您应该将其设置为常量。还可以使用指向条目的指针。后者避免了提供每个字符串的最大字符大小,并避免了腰围空间:

const char * const list[][2] = { { "...", "..." } , ... };
这是指向char的指针的2D数组。初始化器将设置指向初始化器中给定的字符串文本的指针。从自动调整内存空间大小的角度来看,这是最舒适的。编译器可以推断最左边的外部!按初始值设定器中的对数进行标注。对于内部尺寸标注,必须指定。字符串文本的大小与数组无关,因为我们使用指针,数据不存储在数组本身中

第一个常量告诉编译器指向的对象不会被修改。第二个指针本身也是如此,这意味着整个数组不会被修改

有了这个,您可以像在问题中一样使用strcmp:

strcmp(list[i][0], data)
确保数据始终正确终止,即结尾为“\0”

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

.name=/.number=部分是指定的初始化器;自C99以来的标准

用法:

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

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

您真的知道什么是字符**列表[]?不要只是尝试错误,你需要什么?你得到的确切信息是什么?具体在哪里?定义实际上应该报告错误,而不仅仅是警告。字符串应该改变还是保持不变?如果非常量:您打算在数组中更改它们,还是只更改整个条目?好的,请看,这个2d数组不会更改,我将它用作数据库的视点,我需要访问它们并在特定条件下查看它们。但是我从来没有在c中使用过2d数组,这就是为什么我感到困惑的原因。顺便说一句,数组中的字符串不是真正的字符串,因为它们太长了。我想访问数组,比较名称,如果找到,我想打印numb

与之关联的er.char**list[][]不是指向二维字符数组的指针,而是包含字符指针地址的二维指针数组,您无法以这种方式启动。您真的知道什么是字符**list[][]吗?不要只是尝试错误,你需要什么?你得到的确切信息是什么?具体在哪里?定义实际上应该报告错误,而不仅仅是警告。字符串应该改变还是保持不变?如果非常量:您打算在数组中更改它们,还是只更改整个条目?好的,请看,这个2d数组不会更改,我将它用作数据库的视点,我需要访问它们并在特定条件下查看它们。但是我从来没有在c中使用过2d数组,这就是为什么我感到困惑的原因。顺便说一句,数组中的字符串不是真正的字符串,因为它们太长了。我想访问数组,比较名称,如果找到,我想打印与之关联的数字。char**list[][],不是指向二维char数组的指针,而是包含char指针地址的二维指针数组,您不能这样初始化。@ameyCU,因为我想访问下一个元素列表[I][1]如果条件是true@AMH9是的,我知道这就是为什么你需要一个三维字符数组。上一条评论是针对答案的。@ameyCU是的,它是:printf%p\n,list[0];使用printf验证地址是一个非常糟糕的主意。这是因为它不显示指针的实际类型。还要注意,printf%p\n,list[0]是未定义的行为,因为printf要求%p使用void*。@Olaf,在这种情况下这是一个好主意,因为我只是想向AMH9显示语法确实解析为地址。此外,该行为是确定性的,因为地址就是地址,而不管存储在那里的是什么:%p可以很好地处理它。@ameyCU,因为如果条件满足,我想访问下一个元素列表[I][1]true@AMH9是的,我知道这就是为什么你需要一个三维字符数组。上一条评论是针对答案的。@ameyCU是的,它是:printf%p\n,list[0];使用printf验证地址是一个非常糟糕的主意。这是因为它不显示指针的实际类型。还要注意,printf%p\n,list[0]是未定义的行为,因为printf要求%p使用void*。@Olaf,在这种情况下这是一个好主意,因为我只是想向AMH9显示语法确实解析为地址。另外,这种行为是确定性的,因为地址就是地址,不管存储在那里的是什么:%p处理得很好。如果我这样做,代码中的迭代方法是否仍然有效?C标准不提供类型字符串。按惯例,字符序列是如何被解释为字符串的。此列表[i][0]将只获取名称,例如dan,然后是sara。如果这是您想要的,那么它是有效的。@Olaf是的,我知道,这就是为什么我使用指向chars序列的第一个char的指针。@Olaf有趣。刚刚搜索了一个草稿版本,但没有出现字符串。我不知道如果我这样做,代码中的迭代方法是否仍然有效?C标准不提供类型字符串。按惯例,字符序列是如何被解释为字符串的。此列表[i][0]将只获取名称,例如dan,然后是sara。如果这是您想要的,那么它是有效的。@Olaf是的,我知道,这就是为什么我使用指向chars序列的第一个char的指针。@Olaf有趣。刚刚搜索了一个草稿版本,但没有出现字符串。不知道that@AMH9:欢迎。只需考虑更新的变体。您可能还会注意到它会产生更好的可读性/可维护性代码-什么是常量*常量列表[]?@Alexguitar:我在课文中解释了常量。你的确切问题在哪里?因为这就是我用那行代码编译程序时得到的结果。我想说的是它应该是const char*const list[]][]@AMH9:Welcome。只需考虑更新的变体。您可能还会注意到它会产生更好的可读性/可维护性代码-什么是常量*常量列表[]?@Alexguitar:我在课文中解释了常量。你的确切问题在哪里?因为这就是我用那行代码编译程序时得到的结果。我想说的是,它应该是const char*const list[][]