如何比较"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 */
}
您需要从一开始就重新考虑您的方法。
你应该先看看变量类型。
您要声明
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!
我想询问用户是否需要 "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 */
}
您需要从一开始就重新考虑您的方法。
你应该先看看变量类型。
您要声明
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!