我想询问用户是否需要“经典模式”或“高级模式”,我将答案保存在变量中并试图在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
时最容易理解和易于使用的最蠢事,修复了所有内容......
我不知道这个,如果我以前知道它,它会节省很多时间!
答案 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)
您需要从一开始就重新考虑您的方法。
答案 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!