我有一系列字符串。
char strings[][30]={"word1","word2",......,""};
迭代了他们,但最后我收到消息分段错误(核心转储)
尝试使用以下代码:
for(int i=0;strings[i] != "";i++){printing items...}
我认为问题在于!= ""
,但为什么它不起作用?
答案 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
,因为根据编译器选项,编译器可以单独存储这两个字符串文字而不是一个字符串文字。在这种情况下,字符串文字的地址将不同。