Car*_*ndo 13 c string pointers equality equality-operator
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
Run Code Online (Sandbox Code Playgroud)
# ./myProg -hello False
为什么?我意识到strcmp(argv[1], "-hello") == 0返回true ...但为什么我不能使用相等运算符来比较两个C字符串?
pmg*_*pmg 12
在C因为,在大多数情况下,阵列"衰变为一个指向它的第一个元素".
因此,当您拥有数组"foobar"并在大多数上下文中使用它时,它会衰减为指针:
if (name == "foobar") /* ... */; /* comparing name with a pointer */
Run Code Online (Sandbox Code Playgroud)
您希望它将数组的内容与某些内容进行比较.你可以手动完成
if ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */
if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */
if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */
Run Code Online (Sandbox Code Playgroud)
或自动
if (strcmp(name, "foobar")) /* name is not "foobar" */;
Run Code Online (Sandbox Code Playgroud)
因为没有C字符串这样的东西.
在C中,字符串通常是char数组,或指向char的指针(几乎相同).将指针/数组与const数组进行比较将不会产生预期的结果.
更新:我的意思是'没有C字符串',C中没有字符串.通常所说的'C字符串'是独立于语言的(如'Pascal字符串'),它是字符串表示为null - 终止的线性字符数组.
在C中,字符串值(包括字符串文字)表示为char后跟0终止==符的数组,并且您不能使用运算符来比较数组内容; 语言根本没有定义操作.
除非它是sizeof或&运算符的操作数,或者当它是用于初始化声明中的另一个数组的字符串文字时,类型为"N元素数组T"的表达式将隐式转换其类型(衰减)键入"指向T的指针",表达式的值将是数组的第一个元素的地址.
所以当你写作
if (argv[1] == "-hello")
Run Code Online (Sandbox Code Playgroud)
编译器隐式地将表达式"-hello"从类型"7-element array of char"转换为"指向char的指针"(argv[1]已经是指针类型),表达式的值是字符的地址'-'.那么,什么==卷起比较是两个指针值,它是(最有可能)永远不会是平等的,因为"-hello"和argv[1](最有可能)在内存中占据不同的区域.
这就是您必须使用库函数strcmp()来比较字符串值的原因.