比较C语言中的多个字符
我正在做一个石头刀-布游戏(石头-布-剪刀)。在这项任务中,我们被要求使用数字进行比较。因此需要将用户输入的“S”或“K”或“P”分别转换为0、1、2。我在使用strcmp功能时遇到了麻烦,因为我对指针和字符的理解有限,该功能似乎不起作用比较C语言中的多个字符,c,string,char,C,String,Char,我正在做一个石头刀-布游戏(石头-布-剪刀)。在这项任务中,我们被要求使用数字进行比较。因此需要将用户输入的“S”或“K”或“P”分别转换为0、1、2。我在使用strcmp功能时遇到了麻烦,因为我对指针和字符的理解有限,该功能似乎不起作用 int comp_number,user_number; char user_guess[1], computer_guess[1]; printf("Please enter S (for stone) or K (for Knife) or P (
int comp_number,user_number;
char user_guess[1], computer_guess[1];
printf("Please enter S (for stone) or K (for Knife) or P (for Paper).\n");
scanf("%c",&user_guess);
comp_number = rand() % 3;
/*
o = stone
1 = kinfe
2 = paper
*/
if(strcmp(user_guess,"S")==0 || strcmp(user_guess,"s")==0){
user_number=0;
}else if(strcmp(user_guess,"K")==0 || strcmp(user_guess,"k")==0){
user_number=1;
}else{
user_number=2;
}
或者
char user_guess[2], ... /* C-"strings" are '0'-terminated,
that why you always need one more `char`. */
...
scanf("%1s", user_guess); /* Scan in ONLY 1 char! */
...
if (strcmp(user_guess, "S") == 0 || ...
或
不要把这么简单的事情过分复杂化 只要做
if(user_guess='S'| | user_guess='S')
strcmp()
执行以下操作:
- 如果返回值<0,则表示str1小于str2
- 如果返回值>0,则表示str2小于str1
- 如果返回值=0,则表示str1等于str2
因此,它无法处理您想要的内容,而且对于这样一个简单的程序来说,它太复杂了:)一种更简单的读取和逻辑方法(看起来更好)是扫描到一个字符,然后执行一个switch语句:
scanf("%c",&user_guess);
switch (user_guess) {
case 'S':
case 's':
user_number=0;
break;
case 'K':
case 'k':
user_number=1;
break;
case 'P':
case 'p':
user_number=2;
break;
default:
// You can even do some error handling in here!
}
正如下面@alk所建议的,您也可以通过使用tolower
或toupper
转换大小写来删除一些行,然后每个字母只需要处理一个字母大小写。无需将用户猜测和计算机猜测设置为字符串
int comp_number,user_number;
char user_guess, computer_guess;
printf("Please enter S (for stone) or K (for Knife) or P (for Paper).\n");
scanf("%c",&user_guess);
comp_number = rand() % 3;
/*
o = stone
1 = kinfe
2 = paper
*/
if(user_guess == 'S' || user_guess == 's'){
user_number=0;
printf("You chose Stone\n");
}
else if(user_guess == 'K' || user_guess == 'k'){
user_number=1;
printf("You chose Knife\n");
}
else{
user_number=2;
printf("You chose Paper\n");
}
也可以使用三元条件运算符来实现
scanf(" %c",&user_guess);
int user_number = tolower(user_guess) == 's' ? 0
: tolower(user_guess) == 'k' ? 1
: tolower(user_guess) == 'p' ? 2
: -1; // for error handling
这是一个单一的角色
user\u guess==“K”
就可以了。你为什么把事情复杂化了?是的,你可以使用switch/case
语句。试着用“S”代替“S”,以此类推“
代表字符串,”
代表characters@OiciTrapstrcmp
无法处理字符..然后执行@EugeneSh所做的操作。建议或将用户输入更改为字符串而不是字符,这样您就可以使用strcmp,但您必须更改每个,'K'
。。。到“S”
,“K”
。。。etcBTW,而不是将用户输入映射到计算机生成的选择,相反,这可能更容易。提示:char选项[]='SKP'代码>…;-)“所以你想要的东西就不能用了……”为什么?它将正确地进行准备。因为它比较字符串并返回0,所以它们是相同的。但是你只想比较3个字符,所以不妨通过条件句来比较。我知道我只是想说另一种方法过于复杂。但是你问这个问题很好。通过toupper()
/tolower()
包装user\u guess
,可以再删除三行。@alk当然可以。
scanf(" %c",&user_guess);
int user_number = tolower(user_guess) == 's' ? 0
: tolower(user_guess) == 'k' ? 1
: tolower(user_guess) == 'p' ? 2
: -1; // for error handling