在 C 中,我有一个字符数组:
d[20]
它被分配了带有空终止字符的值“if”:
d[0]='i'
d[1]='f'
d[2]='\0'
的值应该strcmp(d,"if")
为0吗?为什么?
我希望strcmp
返回值 0。当我运行它时,我得到 -1 的值
如果您的意思是d[0] = 'i'; d[1] = 'f'; d[2] = '\0';
,那么是的,应该返回 0。 d[2] = '/0'
将分配完全不同的东西,并且您的字符串不会以空值结尾。至少不是你期望的地方 - strcmp 可能会进入杂草并开始吸泥。
@everyone:@Mark 在编辑原始问题时引入了“/0”错字。原件有正确的'\0'。您的大多数答案(以及关于 OP 的假设)都被误导了。
@mekasperasky 以下代码正确生成0
. 如果您可以将其与您的个人代码进行比较并找到差异,那么您可能已经解决了自己的问题。
int main(int argc, char* argv[])
{
char d[20] = {0};
d[0] = 'i';
d[1] = 'f';
d[2] = '\0';
int value = strcmp(d,"if");
cout << value << endl;
return 0;
}
空值由以下方式指示:
d[2]='\0'
而不是你写的 /0 。
d[2]
应该'\0'
,不是'/0'
。
正如其他答案所提到的,'/0'
不是空终止字符,'\0'
是。
您可能认为在字符文字中指定多个字符可能会产生错误。不幸的是(至少在这种情况下)C允许'多字符'文字字符-但多字符文字的确切行为是实现定义的(6.4.4.4/2“字符常量”):
整数字符常量的类型为 int。包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符表示的数值。包含多个字符(例如,'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。
因此,您'/0'
的“角色”最终成为一些实现定义的 int 值,当存储在d[2]
. 您的编译器可能会为“多字符”文字生成警告,但这也可能取决于您为编译器提供的确切选项。
例如,我从 GCC 收到以下警告(我碰巧设置了 -Wall):
C:\temp\test.cpp:6:14: warning: multi-character character constant
在我对 MSVC 和 MinGW 的测试中, 的值为'/0'
,0x00002f30
因此d[2] = '/0'
最终等于d[2] = '0'
.
这适用于我拥有的每个 C 编译器。我没想到会有所不同。它也适用于键盘。
这适用于您的 C 编译器吗?
#include <stdio.h>
#include <string.h>
char d[20];
int main(void) {
d[0]='i';
d[1]='f';
d[2]='\0';
printf("Value of strcmp=%i\n\n",strcmp(d,"if")); /* will print 0 */
return 0;
}