如何比较"text"(字符串)作为if语句的条件

How to compare "text" (string) to be used as the condition for if statement

我想询问用户是否需要 "Classic Mode" 或 "Advanced Mode",我将答案保存在一个变量中并试图在 IF 语句中使用它,但它并没有工作,让我展示我的这部分代码,例如:

int mode;

printf("\n Pick the desired mode: ");
    scanf("%i",&mode);

    if(mode=="Classic"){
        printf("It worked!");
        system("pause");
    }

    if(mode=="Advanced"){
        printf("It worked!");
        system("pause");
    }

题后直接结束,returns值接近20亿...

我以为我遇到了错误,因为变量中有一个值,然后我尝试使用字符串,但我得到了相同的结果!

@EDIT ================================

好的,谢谢大家的帮助,你们在 Whosebug 的速度很快!

最后它是使用过的最白痴的东西 strcmp,易于理解和易于使用,全部修复... 我对这个一无所知,如果我早知道,它会节省很多时间!

字符串比较

C 中的字符串使用指向字符序列(如数组)中的第一个字符的指针进行处理,该字符序列以 [=13=] 作为序列中的最后一个字符终止。比较它们需要使用比较函数,例如 strcmp 否则你正在比较两个(几乎)总是不同的指针。

它们总是不同,因为您 "hardcoded" 的字符串是在您的应用程序代码中某处定义的常量,而您从用户那里接收到的字符串在收到时被 malloc-ed 并放置在堆。

常量存储在一个内存位置,堆存储在其他地方。这两个指针永远不会相同。

另一方面,按值比较两个字符串(比较字符串中的每个字符)是通过 strcmp 或更好的 strncmp 完成的,它迭代数组中的字符并比较每个字符。

变量类型有问题

您当前将 mode 变量定义为 int mode,它不能保存字符串值。

此外,当从 scanf 中检索值时,您需要指定 %s,因为它检索的是字符串而不是整数。

当使用char *时,指针需要指向一块预先分配的内存(例如使用malloc)。

或者 -- 整数比较

不过,您可以保持当前结构,但定义一些常量,例如

static const CLASSIC_MODE = 1;
static const ADVANCED_MODE = 2;

并且用户需要根据显示的说明/选项列表输入 1 或 2。

那么比较就是:

if (mode == CLASSIC_MODE) {
     /* classic mode */
}

您需要从一开始就重新考虑您的方法。

  • 方法一

    如果你想从用户那里获取基于字符的输入,你需要的是

    1. 定义一个数组。
    2. 使用 %sscanf() 进行输入
    3. 使用strcmp()比较输入。

    注意:这可能有点*棘手*,考虑到输入的*情况*(上部 and/or 仅下部或混合。

  • 方法二

    如果你想编码用户输入,即想为每个字符串取一个等价的整数,你可以

    1. 定义一个 int(和你一样)
    2. scanf()%i,你又做了
    3. 使用 == 与字符串的预定义值进行比较,或者,对于 更长的 可能输入列表,使用 switch 语句。

你应该先看看变量类型。

您要声明

int mode;

这意味着在这个模式变量中,编译器正在等待一些数字。 换句话说,

mode = 5; // correct
mode = "Foobar" // incorrect (compiler error)

您必须将模式变量声明为 char *

char *mode;

这意味着该模式现在包含超过 1 个字符(一个字符)。

然后,将输入与您的经典或高级字符串进行比较 你必须这样做

if (strcmp(mode, "Classic") == 0) //Since the strcmp function returns 0 if the strings matchs
{
  //Classic Mode
}
else if (strcmp(mode, "Advanced") == 0)
{
  //Advanced Mode
}
else
 printf("Please use Classic or Advanced\n");

除了已经解释过的内容,我不会尝试解释更多内容,而是会向您展示使用 strcmp 和 strcasecmp 的可能方法。

对于 strcmp 你需要 string.h:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void){
    char mode[256];

    printf("\n Pick the desired mode: ");
    if((scanf("%s",mode) != EOF)){
        if(strcmp(mode, "Classic") == 0){
            printf("It worked!\n");
        }

        if(strcmp(mode, "Advanced") == 0){
            printf("It worked!\n");
        }
    }

    return 0;
}

输出1:

./program 
 Pick the desired mode: classic

不起作用,因为 strcmp 区分大小写。 输出 2:

./program 
 Pick the desired mode: Classic
It worked!

成功是因为我输入的是 Classic 而不是 classic。

如果您不关心区分大小写,那么您需要 strcasecmp 函数,您可以在 strings.h 中找到它,而不是 string.h:

#include<stdio.h>
#include<strings.h>
#include<stdlib.h>

int main(void){
    char mode[256];

    printf("\n Pick the desired mode: ");
    if((scanf("%s",mode) != EOF)){
        if(strcasecmp(mode, "Classic") == 0){
            printf("It worked!\n");
        }

        if(strcasecmp(mode, "Advanced") == 0){
            printf("It worked!\n");
        }
    }

    return 0;
}

输出:

./program 
 Pick the desired mode: classic
It worked!