如何比较“text”(字符串)作为if语句

时间:2015-08-17 14:40:40

标签: c string string-comparison

我想询问用户是否需要“经典模式”或“高级模式”,我将答案保存在变量中并试图在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");
    }

在问题结束后直接结束并返回接近20亿的数据......

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

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

好的伙计们,感谢所有的帮助,你们在StackOverflow中的速度很快!

最后,它是使用strcmp时最容易理解和易于使用的最蠢事,修复了所有内容...... 我不知道这个,如果我以前知道它,它会节省很多时间!

4 个答案:

答案 0 :(得分:6)

字符串比较

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

他们总是不同,因为你的字符串是硬编码的"是在应用程序代码中的某个位置定义的常量,而您从用户收到的字符串在收到并放置在堆中的某个位置时会进行malloc编辑。

常量存储在一个内存位置,堆存储在其他位置。这两个指针永远不会是一样的。

另一方面,按值比较两个字符串(比较字符串中的每个字符)是通过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 :(得分:4)

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

  • 方法1

    如果您想从用户那里获取基于 characrter 的输入,那么您需要的是

    1. 定义一个数组。
    2. 使用%sscanf()进行输入
    3. 使用strcmp()来比较输入。
    4. 注意:考虑到* case *(上限和/或下限或混合。)的输入,这可能有点*棘手*。

    5. 方法2

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

      1. 定义int(正如您所做)
      2. scanf()%i,您再次
      3. 使用==与字符串的预定义值进行比较,或者对于更长可能输入的列表,请使用switch语句。

答案 2 :(得分:2)

您之前应该查看变量类型。

您正在宣布

int mode;

表示在此模式变量中,编译器正在等待某些数字。 换句话说,

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

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

char *mode;

这意味着现在的模式,包含多个1个字符(一个字符)。

然后,将输入与Classic或Advanced字符串进行比较 你必须这样做

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

答案 3 :(得分:0)

我不会尝试解释比已经解释过的更多,而是我将向您展示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区分大小写。 OUTPUT2:

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

工作是因为我输入的是经典而不是经典。

如果您不关心区分大小写,那么您需要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!