谁能解释一下为什么即使用户键入'Classical'或'Jazz',前面的代码块总是显示"对不起,这不是选项之一" ?
#include <stdio.h>
int main()
{
char c[20];
printf("Hey! I hear you like music! What type do you like? (Classical/Jazz/Rock) ");
gets(c);
if(c == "Classical" || c == "classical")
printf("Classical music is great.");
else if(c == "Jazz" || c == "jazz")
printf("Jazz is awesome!");
else
printf("Sorry, that's not one of the choices.");
getchar();
return 0;
}
在C语言中,您必须使用strcmp()
来比较字符串:
if(strmp(c, "Classical") == 0 || strcmp(c, "classical") == 0)
printf("Classical music is great.");
else if(strcmp(c, "Jazz") == 0 || strcmp(c, "jazz") == 0)
printf("Jazz is awesome!");
else
printf("Sorry, that's not one of the choices.");
如果a
和b
是两个C字符串,a == b
不会像你想象的那样。它检查a
和b
是否指向相同的内存,而不是检查它们是否由相同的字符组成。
在您的情况下,c == "Classical"
等将始终计算为false
if(c == "Classical" || c == "classical")
以上是无效的字符串比较。使用strcmp
代替,如下所示:
if(0 == strcmp(c, "Classical")) { // if c and "Classical" are equal
printf("equal!n");
}
在C语言中,你不能直接比较字符串指针,因为那只是比较实际的指针,而不是它们所指的对象。
由于字符串字面值总是指针,而数组可以衰变为指针,因此您所做的是比较指针。
实际上,在比较指针时,你甚至不能确定两个本来相等的字符串字面值是否相等。编译器可以将字符串存储在不同的位置,即使它们是相同的。
正如其他人所解释的,在C中必须使用strcmp
函数来比较字符串
您必须将它们作为字符串进行比较。
if(strcmp(c,"Classical")==0 || strcmp(c,"classical")==0)
printf("Classical music is great.");
else if(strcmp(c,"Jazz")==0 || strcmp(c,"jazz")==0)
printf("Jazz is awesome!");
else
printf("Sorry, that's not one of the choices.");