【问题标题】:How to compare "text" (string) to be used as the condition for if statement如何比较“文本”(字符串)以用作 if 语句的条件
【发布时间】:2015-08-17 14:40:40
【问题描述】:

我想问用户是否想要“经典模式”或“高级模式”,我将答案保存在变量中并尝试在 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 时最愚蠢的事情,易于理解且易于使用,已修复所有问题... 我不知道这个,如果我之前知道它会节省很多时间!

【问题讨论】:

  • 您将intchar* 进行比较。这是错误的。将mode 设为字符数组,更改scanf 中的格式说明符,然后使用strcmpstrncmp 比较来自string.h 的字符串。
  • 嘿?将intchar * 合并?先读基本的 C 书,先生。

标签: c string string-comparison


【解决方案1】:

字符串比较

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

它们总是不同的,因为您“硬编码”的字符串是在应用程序代码中某处定义的常量,而您从用户处接收的字符串在接收时是 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 */
}

【讨论】:

  • 好的,比较字符串,所以,如果我想添加很多可能的答案,例如:if(mode=="Classic" || mode=="classic" || mode=="classiiiic" 我需要创建这 3 个字符串来比较?
  • 您的 mode 变量不应是整数。它应该是char*。修复后,您可以比较if(strcmp(mode, classic) == 0 || strcmp(mode, "Classic") == 0)
  • @MihaiStancu 只是添加,如果是char *,则需要分配内存。 :)
  • 详细信息:“C 中的字符串是指向...的指针”并非如此。在 C 中,字符串不是指针。最好将 string 视为具有空字符的数组。 “字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。”
  • @chux 标准中的措辞是正确的,它指的是实际的 string 数据,它甚至可以用作程序只读内存中的常量,而无需任何 malloc -- 但通常通过处理程序指针使用,例如char *。我更改了措辞以更好地反映这一点。
【解决方案2】:

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

  • 方法 1

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

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

    注意:考虑到输入的 *case*(仅大写和/或小写或混合),这可能有点*棘手*。

  • 方法 2

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

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

【讨论】:

  • 谢谢,但同样的事情我问了 Mihai,如果我想添加很多可能的答案,例如:if(mode=="Classic" || mode=="classic" || mode=="classiiiic" 我需要创建所有这些带有可能答案的字符串对?所以我可以比较!?
  • @Skeppler:正是出于这个原因(拼写错误),您应该提供一个带有数字的菜单,指示选项(方法 2),或者只使用首字母。检查所有可能的拼写错误是完全不可能的。整数还允许您使用switch 而不是if(希望是else)。
  • @Skepller 首先,您不能使用== 比较字符串,其次,如果您按照我的第二种方法,switch 案例将有很大帮助。
  • @SouravGhosh:抱歉,没有添加(at)OP。我的意思是 他的 用户输入中的拼写错误。 ;-)
  • @DevSolar 很好,很好。我也只是将switch 语句用法添加到我的答案中。 :)
【解决方案3】:

您应该先了解一下变量类型。

你正在声明一个

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

【讨论】:

  • 好吧,当我使用这段代码时,程序在问题后立即崩溃......知道为什么吗?
  • 编译器是怎么说的?
  • 没什么,它编译得很好,然后崩溃了,但我已经修复了,我按照 Mihai 所说的 (char *mode) 声明,当我更改为 char mode[50] 时,它工作得很好!
  • 是的,因为你之前必须分配它。
  • 是的,米海在他的回答中说过,但是我认为在这么小的程序中不需要动态分配,所以我没有使用它,昨天我今天回来工作了完全忘记了,正在代码中寻找该死的错误哈哈
【解决方案4】:

我不会尝试解释超出已解释的内容,而是向您展示使用 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!

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

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

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多