比较C语言中的多个字符

比较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 (

我正在做一个石头刀-布游戏(石头-布-剪刀)。在这项任务中,我们被要求使用数字进行比较。因此需要将用户输入的“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 (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@OiciTrap
strcmp
无法处理字符..然后执行@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