在C中,我有一个字符数组:
d[20]
使用空终止符分配值'if':
d[0]='i'
d[1]='f'
d[2]='\0'
strcmp(d,"if")
的值应该为0吗?为什么?
我希望strcmp
返回值0.当我运行它时,我得到的值为-1
答案 0 :(得分:6)
如果你的意思是d[0] = 'i'; d[1] = 'f'; d[2] = '\0';
,那么是,那应该返回0. d[2] = '/0'
将分配一些完全不同的东西,你的字符串不会被空终止。至少不是你预期的那样 - strcmp可能会进入杂草并开始吸泥。
答案 1 :(得分:2)
@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;
}
答案 2 :(得分:1)
d[2]
应该是'\0'
,而不是'/0'
。
答案 3 :(得分:1)
空值表示为:
d[2]='\0'
你写的时候而不是/ 0。
答案 4 :(得分:1)
正如其他答案所述,'/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'
。
答案 5 :(得分:1)
这适用于我拥有的每个C编译器。我没想到会有所不同。它也适用于Codepad。
这适用于您的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;
}