0

有人可以解释为什么即使用户键入“古典”或“爵士”,前面的代码块总是导致“抱歉,这不是选择之一”?

#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;
}
4

4 回答 4

3

在 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.");

如果aandb是两个 C 字符串,a == b则不会像您认为的那样做。它检查a和是否b指向相同的内存,而不是检查它们是否由相同的字符组成。

在您的情况下,c == "Classical"等将始终评估为假。

于 2013-03-14T07:27:44.287 回答
2
if(c == "Classical" || c == "classical")

以上是无效的字符串比较。改为使用strcmp如下:

if(0 == strcmp(c, "Classical")) { // if c and "Classical" are equal
    printf("equal!\n");
}

点击此处查看参考页面。

于 2013-03-14T07:27:55.940 回答
0

您必须将它们作为字符串进行比较。

 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.");
于 2013-03-14T07:30:16.907 回答
0

在 C 中,您不能直接比较字符串指针,因为它实际上只是比较实际指针而不是它们指向的指针。

由于字符串文字始终是指针,并且数组可以衰减为指针,因此您正在做的是比较指针。

事实上,你甚至不能确定两个其他相等的字符串文字在比较它们的指针时是否相等。编译器可能会将字符串存储在不同的位置,即使它们是相同的。

正如其他人所解释的,在 C 中,您必须使用该strcmp函数来比较字符串。

于 2013-03-14T07:32:08.830 回答