C语言中如何正确比较二维字符串数组的指定元素?
解决二维char指针数组的字符串比较问题
哦,我明白你遇到的问题了——这是典型的二维指针数组的访问误区,咱们一步步拆解:
为什么你的方法没用?
先看你的数组声明:char* arrs[1000][1000];,这是一个二维的char指针数组,简单说就是:
arrs是一个包含1000个元素的数组,每个元素又是一个包含1000个char*指针的数组- 所以
arrs[0]其实是二维数组的第一行,它的类型是char**(指向char指针的指针),而不是你以为的单个字符串指针 - 同理
arrj[2]是arrj的第三行,也是char**类型
那你的两种尝试为什么失败就很清楚了:
- 直接用
arrs[0] == arrj[2]:你在比较两行数组的首地址,这两个地址肯定不一样,所以永远返回false - 用
strcmp(arrs[0], arrj[2]):strcmp要求传入两个char*(字符串指针),但你传的是char**,类型不匹配会导致未定义行为,自然得不到正确结果
正确的比较方式
你需要访问到二维数组中具体的字符串元素,也就是arrs[i][j]和arrj[k][l]这样的char*指针,再用strcmp比较(记住:strcmp返回0时表示两个字符串相等)。
比如你说arrs[0] = Bob,实际应该是arrs[0][0] = "Bob"(假设你把Bob存在第0行第0列),arrj[2] = Tom对应arrj[2][0] = "Tom",那正确的比较代码是:
#include <string.h> // 必须包含strcmp的头文件 // 比较arrs第0行第0列和arrj第2行第0列的字符串 if (strcmp(arrs[0][0], arrj[2][0]) == 0) { // 两个字符串相等的逻辑 } else { // 不相等的逻辑,比如你例子里Bob和Tom就会走这里 }
额外建议:是否真的需要二维数组?
如果你的场景里只需要存储一维的字符串列表(比如arrs是1000个名字,arrj也是1000个名字),那你完全可以把数组改成一维的,这样访问和比较更简单:
// 一维char指针数组,更符合单列表的场景 char* arrs[1000]; char* arrj[1000]; arrs[0] = "Bob"; arrj[2] = "Tom"; // 直接比较arrs[0]和arrj[2] if (strcmp(arrs[0], arrj[2]) == 0) { // 相等逻辑 }
内容的提问来源于stack exchange,提问作者L_L
相关产品推荐
相关产品推荐

