提问人: 提问时间:10/14/2010 最后编辑:Rodrigo de Azevedo 更新时间:7/12/2023 访问量:90208
在 C 中使用相等运算符 == 比较两个字符串的相等性 [duplicate]
Using the equality operator == to compare two strings for equality in C [duplicate]
问:
int main (int argc, **argv)
{
if (argv[1] == "-hello")
printf("True\n");
else
printf("False\n");
}
# ./myProg -hello False
为什么?我意识到回报是真的......但是为什么我不能使用相等运算符来比较两个 C 字符串呢?strcmp(argv[1], "-hello") == 0
答:
因为(例如)实际上是指向字符串的指针。所以你要做的就是比较指针。argv[1]
因为没有 C 字符串这样的东西。
在 C 语言中,字符串通常是 char 数组,或指向 char 的指针(几乎相同)。将指针/数组与 const 数组进行比较不会给出预期的结果。
更新:我所说的“没有 C 字符串”的意思是,C 中没有字符串。通常所说的“C 字符串”与语言无关(如“Pascal 字符串”),它是字符串表示为以 null 结尾的线性字符数组。
评论
char
char
char
const char
因为 C 字符串本身并不存在。它们是以 .\0
相等运算符将测试指向数组第一个元素的指针是否相同。它不会在词典上进行比较。==
另一方面,可能会返回非零,但这并不意味着运算符会按字典顺序进行比较。那是由于其他事实。"-hello" == "-hello"
==
如果你想在词典上进行比较,你总是可以这样做:
#define STR_EQ(s1,s2) \
strcmp(s1,s2) == 0
我看到你标记为 C++。因此,您可以这样做:
std::string arg1 ( argv[1] );
if (arg1 == "-hello"){
// yeahh!!!
}
else{
//awwwww
}
评论
因为 C 字符串是字符数组。数组只是指向数组中第一个元素的指针,当您使用 == 比较两个指针时,它会比较它们指向的内存地址,而不是它们指向的值。
评论
字符串不是 C 中的本机类型。您在该示例中比较的是两个指针。一个是你的第一个参数,另一个是内容为“-hello”的静态字符数组。
你真的想使用 strncmp 或类似的东西。
您不能将 C 中的字符串与 == 进行比较,因为 C 编译器对字符串文字之外的字符串一无所知。
编译器看到与任一端的 a 的比较,因此它会执行指针比较(比较指针中存储的地址)char*
使用 == 时,您正在比较指针。也就是说,如果两个操作数引用内存中的同一字符串,它将返回 true。因此,它不适合用于按字典顺序比较字符串。
在 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" */;
评论
if(strcmp(name, "foobar"))
如果字符串等效,则计算结果为 false,因为在这种情况下它返回 0。 会更好if (strcmp(name, "foobar") == 0)
在 C 语言中,字符串值(包括字符串文字)表示为后跟 0 终止符的数组,不能使用运算符来比较数组内容;语言根本没有定义操作。char
==
除非它是 or 运算符的操作数,或者当它是用于初始化声明中另一个数组的字符串文本时,类型为“N 元素数组 T”的表达式的类型将隐式转换(衰减)为类型“指向 T”,并且表达式的值将是数组第一个元素的地址。sizeof
&
所以当你写
if (argv[1] == "-hello")
编译器将表达式从“7元素数组的char”隐式转换为“pointer to char”(已经是指针类型),表达式的值是字符的地址。因此,最终比较的是两个指针值,它们(很可能)永远不会相等,因为并且(很可能)占据了内存中的不同区域。"-hello"
argv[1]
'-'
==
"-hello"
argv[1]
这就是为什么你必须使用库函数来比较字符串值的原因。strcmp()
评论
char
评论