int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
# ./myProg -hello False
为什么会返回False?我知道strcmp(argv[1], "-hello") == 0
返回true,但是为什么不能用等号运算符来比较两个C字符串?
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
# ./myProg -hello False
为什么会返回False?我知道strcmp(argv[1], "-hello") == 0
返回true,但是为什么不能用等号运算符来比较两个C字符串?
因为argv[1]
(例如)实际上是一个指向字符串的指针,所以你正在比较指针。
在C语言中,你不能使用==运算符比较字符串,因为C编译器对于除了字符串字面值之外的字符串并没有真正的了解。
编译器只会把两边的char*
作为指针进行比较(即比较指针存储的地址)。
在 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" */;
因为C语言中没有所谓的字符串。
在C语言中,字符串通常是char数组或char指针(几乎相同)。将指针/数组与const数组进行比较将不会得到预期的结果。
更新:我所说的“没有C字符串”是指,在C语言中没有字符串。通常所说的“C字符串”是与语言无关的(就像“Pascal字符串”一样),它是将字符串表示为以null结尾的线性字符数组。
char
数组。 - David Thornleychar
数组的形式存储(在C中,字符串文字以char
数组的形式存储,在C++中则以const char
数组的形式存储)。 - John Bodechar
数组,并以0终止符结尾。你不能使用==
运算符比较数组内容,这种操作在语言中没有被定义。sizeof
或&
运算符的操作数,或者当它是一个字符串字面量被用于初始化声明另一个数组时,类型为“N元素数组T”的表达式将隐式转换(衰减)为类型“指向T的指针”,并且表达式的值将是数组的第一个元素的地址。if (argv[1] == "-hello")
"-hello"
从"7个字符元素的数组"隐式转换为"指向字符的指针"(argv[1]
已经是指针类型),而表达式的值是字符'-'
的地址。因此,==
比较的是两个指针值,它们(很可能)永远不会相等,因为"-hello"
和argv[1]
(很可能)占据内存中的不同区域。strcmp()
来比较字符串值的原因。char
数组,其中包含一个0终止符... - pmg\0
结尾的字符数组。==
将测试数组第一个元素的指针是否相同,而不会按字典顺序进行比较。"-hello" == "-hello"
可能返回非零值,但这并不意味着==
运算符按字典顺序进行比较。这是由其他事实造成的。#define STR_EQ(s1,s2) \
strcmp(s1,s2) == 0
std::string arg1 ( argv[1] );
if (arg1 == "-hello"){
// yeahh!!!
}
else{
//awwwww
}
在C语言中,字符串不是本地类型。在这个例子中,你正在比较两个指针。一个指向你的第一个参数,另一个是一个静态字符数组,用“-hello”的内容填充。
你应该使用strncmp或类似的函数。
当你使用==时,你正在比较指针。也就是说,如果两个操作数引用内存中的同一字符串,则它将返回true。因此,在按字典顺序比较字符串时,它不适用。
因为C字符串是字符数组。数组只是指向数组中第一个元素的指针,当你使用==比较两个指针时,它比较它们所指向的内存地址,而不是它们所指向的值。