通过字符串数组迭代

时间:2017-10-20 20:00:11

标签: c

我有一系列字符串。

char strings[][30]={"word1","word2",......,""}; 

迭代了他们,但最后我收到消息分段错误(核心转储)

尝试使用以下代码:

for(int i=0;strings[i] != "";i++){printing items...}

我认为问题在于!= "",但为什么它不起作用?

4 个答案:

答案 0 :(得分:2)

使用strcmp比较C中的字符串。==!=不适用于C语言中的字符串。

答案 1 :(得分:2)

您不能以这种方式比较字符串。大多数上下文中的数组衰减为指向第一个元素的指针,字符串是字符数组。您实际要做的是将strings[i]的地址与字符串文字""的地址进行比较。这些总是不相等的,所以比较总是如此。

结果,您遍历数组的末尾。读取数组末尾会调用undefined behavior,在这种情况下会显示为崩溃。

您需要使用strcmp来比较字符串。如果字符串匹配,则返回0.

for(int i=0;strcmp(strings[i],"") != 0;i++)

答案 2 :(得分:0)

无法将字符数组的内容与C中的==!=进行比较。string[i]""都会衰减为指针,相应的指针值将会永远不会平等。因此,您超出数组边界并产生未定义的行为。

但您可以轻松检查字符串的第一个字符是否是字符串终止字符:

char strings[][30]={"word1","word2",""};

for(int i=0;strings[i][0] != '\0';i++)
{ ...
}

答案 3 :(得分:0)

在此数组初始值设定项中

char strings[][30]={"word1","word2",......,""}; 

实际上,数组的最后一个元素按以下方式初始化

char strings[][30]={"word1","word2",......, { '\0' ) };

在这种情况下

strings[i] != "";

比较了两个指针:第一个是指向字符数组string[i]的第一个字符的指针,第二个是指向字符串文字""的第一个字符的指针。

为清楚起见,可以通过以下方式等效地重写条件

&strings[i][0] != &""[0];

很明显,指针彼此不相等,因为字符数组占据了自己的内存范围。该数组不与字符串文字占用的静态内存重叠。

要使循环正确,您可以按以下方式重写条件

for(int i=0; *strings[i]; i++){printing items...}

for(int i=0; strings[i][0] != '\0' ;i++){printing items...}

考虑到如果您甚至会写下以下条件

"" == ""

没有必要产生true,因为根据编译器选项,编译器可以单独存储这两个字符串文字而不是一个字符串文字。在这种情况下,字符串文字的地址将不同。