使用等于运算符==在C中比较两个字符串的相等性

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字符串?

Oli*_*rth 18

因为argv[1](例如)实际上是指向字符串的指针.所以你所做的只是比较指针.


Bar*_*nau 12

你无法将C中的字符串与==进行比较,因为C编译器并不真正了解字符串之外的字符串.

编译器看到与char*两侧的a进行比较,因此它进行指针比较(比较存储在指针中的地址)


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)


jv4*_*v42 7

因为没有C字符串这样的东西.

在C中,字符串通常是char数组,或指向char的指针(几乎相同).将指针/数组与const数组进行比较将不会产生预期的结果.

更新:我的意思是'没有C字符串',C中没有字符串.通常所说的'C字符串'是独立于语言的(如'Pascal字符串'),它是字符串表示为null - 终止的线性字符数组.

  • 肯定有一个叫做[C string]的东西(http://en.wikipedia.org/wiki/C_string).我不知道你的意思.也许"C语言中没有C字符串类型"? (4认同)
  • 更准确地说,字符串值由字符序列*后跟0终结符*表示*.这些序列存储为`char`数组(string*literals*存储为C中`char`的数组,C++中为`const char`). (3认同)

Joh*_*ode 5

在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()来比较字符串值的原因.