使用相等运算符==在C [duplicate]中比较两个字符串是否相等

iyfjxgzm  于 2023-08-03  发布在  其他
关注(0)|答案(9)|浏览(92)

此问题在此处已有答案

How do I properly compare strings in C?(10个答案)
两年前关闭。

int main (int argc, **argv)
{
       if (argv[1] == "-hello")
            printf("True\n");
       else
            printf("False\n");
}

个字符
为什么?我知道strcmp(argv[1], "-hello") == 0返回true...但是为什么我不能用相等运算符来比较两个C字符串呢?

jgzswidk

jgzswidk1#

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

tez616oj

tez616oj2#

你不能用==比较C中的字符串,因为C编译器除了字符串字面量之外,并没有真正的字符串线索。
编译器会看到与char*的比较,因此它会进行指针比较(比较存储在指针中的地址)。

g6baxovj

g6baxovj3#

在**C**中,因为在大多数情况下,数组“衰减为指向其第一个元素的指针”。
所以,当你有数组"foobar"并在大多数上下文中使用它时,它会衰减为指针:

if (name == "foobar") /* ... */; /* comparing name with a pointer */

字符串
你想让它把数组的内容和 * 某个东西 * 进行比较。你可以手动操作

if ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */
if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */
if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */


或者自动地

if (strcmp(name, "foobar")) /* name is not "foobar" */;

iszxjhcz

iszxjhcz4#

因为根本就没有C弦这种东西。
在C语言中,字符串通常是一个char数组,或者是一个char指针(两者几乎相同)。将指针/数组与常量数组进行比较不会给予预期的结果。
更新:我所说的“没有C字符串”是指,C中没有字符串。通常被称为“C字符串”的是独立于语言的(就像“Pascal字符串”一样),它将字符串表示为以空值结尾的线性字符数组。

osh3o9ms

osh3o9ms5#

在C中,字符串值(包括字符串文字)表示为char后跟0结束符的数组,并且不能使用==运算符来比较数组内容;语言并没有定义操作。
除非它是sizeof&运算符的操作数,或者当它是一个字符串文字被用来初始化声明中的另一个数组时,类型为“T的N元素数组”的表达式将其类型隐式转换(衰减)为类型“指向T的指针”,表达式的值将是数组第一个元素的地址。
所以当你写的时候

if (argv[1] == "-hello")

字符串
编译器隐式地将表达式"-hello"从类型“7-element array of char”转换为“pointer to char”(argv[1]已经是指针类型),并且表达式的值是字符'-'address。因此,==最终比较的是两个 pointer 值,它们(很可能)永远不会相等,因为"-hello"argv[1](很可能)占据内存中的不同区域。
这就是为什么你必须使用像strcmp()这样的库函数来比较字符串值。

9gm1akwq

9gm1akwq6#

因为C字符串并不存在。它们是以\0结尾的char数组。
相等运算符==将测试指向数组第一个元素的指针是否相同。它不会在字典上比较。
另一方面,"-hello" == "-hello"可能返回非零,但这并不意味着==运算符按字典顺序进行比较。这是由于其他事实。
如果你想按字典顺序进行比较,你总是可以这样做:

#define STR_EQ(s1,s2)    \
   strcmp(s1,s2) == 0

字符串
我看到你标记为C++。所以你可以这样做:

std::string arg1 ( argv[1] );
 
 if (arg1 == "-hello"){
    // yeahh!!!
 }
 else{
    //awwwww
 }

c90pui9n

c90pui9n7#

字符串不是C中的原生类型。你在那个例子中比较的是两个指针。一个是第一个参数,另一个是内容为“-hello”的静态字符数组。
你真的想使用strncmp或类似的东西。

5fjcxozz

5fjcxozz8#

当你使用==时,你是在比较指针。也就是说,如果两个操作数引用内存中的同一个字符串,它将返回true。因此,它不适合用于按字典顺序比较字符串。

bksxznpy

bksxznpy9#

因为C字符串是字符数组。数组只是指向数组中第一个元素的指针,当你使用==比较两个指针时,它比较的是它们指向的内存地址,而不是它们指向的值。

相关问题