当前位置: 首页 > 知识库问答 >
问题:

是否存在strcmp函数不起作用的原因?

宋英杰
2023-03-14

我有下面的代码,它不适用于最后两个条件语句:else-if和else。使用strcmp,我会认为,如果player1和player2都有相同的字符串,那么如果body被启用,那么就会启用,但它没有。相反,它再次循环,要求输入剪刀、石头或纸。此外,输入汉堡包和石头之类的东西不会激活else部分,而是要求输入剪刀、石头和纸。

update1:根据调试器,据我所知,这似乎是因为其中一个——如果之前的文件已经用尽了。如果我为player1输入纸,为player2输入纸,那么它会在这个文件中输入:“否则如果(strcmp(player1,“纸”)==0)”。但是它不会打印任何东西,因为它的身体里没有另一张纸。然后,它再次在当循环中循环(再次询问输入:石头、纸或剪刀),永远不会到达这个:“否则如果(strcmp(player1, player2)==0)”

更新2:如果我把'else If(strcmp(player1,player2)==0)放在最上面,从'If'语句开始。该计划有效。然而,由于类似的情况,else仍然不起作用。把它放在最上面是行不通的,因为它应该包含任何其他不是剪刀、石头或纸的措辞。

#include <stdio.h>
#include <string.h>

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        scanf("%24s%24s",player1,player2);
        

        if(strcmp(player1, "rock") == 0)
        {
            if (strcmp(player2, "scissors") == 0)
                printf("player 1 wins, rock crushes scissors\n");
            else if(strcmp(player2, "paper") == 0)
                printf("player 2 wins, paper covers rock\n");
        }
        
        else if(strcmp(player1, "scissors") == 0)
        {
            if(strcmp(player2, "paper") == 0)
                printf("player 1 wins, scissor cuts paper\n");
            else if(strcmp(player2, "rock") == 0)
                printf("player 2 wins, rock crushes scissors\n");

        }
        
        else if(strcmp(player1, "paper") == 0)
        {
            if(strcmp(player2, "rock") == 0)
                printf("player 1 wins, paper covers rock\n");
            else if(strcmp(player2, "scissors") == 0)
                printf("player 2 wins, scissor cuts paper\n");

        }
        
        else if(strcmp(player2, "rock") == 0)
        {
            if (strcmp(player1, "scissors") == 0)
                printf("player 2 wins, rock crushes scissors\n");
            else if(strcmp(player1, "paper") == 0)
                printf("player 1 wins, paper covers rock\n");

        }
        
        else if(strcmp(player2, "scissors") == 0)
        {
            if(strcmp(player1, "paper") == 0)
                printf("player 2 wins, scissor cuts paper\n");
            else if(strcmp(player1, "rock") == 0)
                printf("player 1 wins, rock crushes scissors\n");

        }
        
        else if(strcmp(player2, "paper") == 0)
        {
            if(strcmp(player1, "rock") == 0)
                printf("player 2 wins, paper covers rock\n");
            else if(strcmp(player1, "scissors") == 0)
                printf("player 1 wins, scissor cuts paper\n");

        }

        else if(strcmp(player1,player2) == 0)
        {
            printf("nobody wins, let’s sing it again!\n");
        }

        else
        {
            printf("incorrect input, try again\n");
        }
        
    }

        return 0;
}

共有2个答案

孟翰海
2023-03-14

我会稍微修改一下,让它更清晰一点。使用开关,你可以清楚地看到获胜的逻辑

const char * const answers[] = {"rock", "scissors", "paper"};
#define ROCK 0
#define SCISSORS 1
#define PAPER 2
#define NOTFOUND 3

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        if(scanf("%24s%24s",player1,player2) != 2) 
        {
            printf("Wrong input\n");
            continue;
        }

        int pl1, pl2;

        for(pl1 = 0; pl1 < 3; pl1++)
        {
            if(!strcmp(player1, answers[pl1])) break;
        }

        for(pl2 = 0; pl2 < 3; pl2++)
        {
            if(!strcmp(player2, answers[pl2])) break;
        }

        if(pl1 == NOTFOUND || pl2 == NOTFOUND)
        {
            printf("Wrong input\n");
            continue;
        }
        
        if(pl1 == pl2)
        {
            printf("Draw\n");
            continue;
        }

       
        if (pl1 == ROCK)
        {
            if (pl2 == SCISSORS)
                printf("player 1 wins, rock crushes scissors\n");
            else if(pl2 == PAPER)
                printf("player 2 wins, paper covers rock\n");
        }

/*      change below acordingly 

        if(strcmp(player1, "scissors") == 0)
        {
            if(strcmp(player2, "paper") == 0)
                printf("player 1 wins, scissor cuts paper\n");
            else if(strcmp(player2, "rock") == 0)
                printf("player 2 wins, rock crushes scissors\n");

        }
        
        if(strcmp(player1, "paper") == 0)
        {
            if(strcmp(player2, "rock") == 0)
                printf("player 1 wins, paper covers rock\n");
            else if(strcmp(player2, "scissors") == 0)
                printf("player 2 wins, scissor cuts paper\n");
        }
    
        if(strcmp(player2, "rock") == 0)
        {
            if (strcmp(player1, "scissors") == 0)
                printf("player 2 wins, rock crushes scissors\n");
            else if(strcmp(player1, "paper") == 0)
                printf("player 1 wins, paper covers rock\n");

        }
            
        if(strcmp(player2, "scissors") == 0)
        {
            if(strcmp(player1, "paper") == 0)
                printf("player 2 wins, scissor cuts paper\n");
            else if(strcmp(player1, "rock") == 0)
                printf("player 1 wins, rock crushes scissors\n");

        }
        
        if(strcmp(player2, "paper") == 0)
        {
            if(strcmp(player1, "rock") == 0)
                printf("player 2 wins, paper covers rock\n");
            else if(strcmp(player1, "scissors") == 0)
                printf("player 1 wins, scissor cuts paper\n");

        }
        */
    }

    return 0;

但实际上,如果不需要,我想避免如果-否则梯子:

const char * const answers[] = {"rock", "scissors", "paper"};
#define ROCK 0
#define SCISSORS 1
#define PAPER 2
#define NOTFOUND 3

#define MAKERESULT(a,b) ((a)*10 + (b))

int main(void) {
    
    char player1[25];
    char player2[25];
    
    while(1){
        
        printf("please type one of the following: rock, paper or scissors. Player1 goes first\n");
        if(scanf("%24s%24s",player1,player2) != 2) 
        {
            printf("Wrong input\n");
            continue;
        }

        int pl1, pl2;

        for(pl1 = 0; pl1 < 3; pl1++) if(!strcmp(player1, answers[pl1])) break;
        for(pl2 = 0; pl2 < 3; pl2++) if(!strcmp(player2, answers[pl2])) break;

        switch(MAKERESULT(pl1,pl2))
        {
            case MAKERESULT(ROCK,SCISSORS):
                printf("player 1 wins, rock crushes scissors\n");
                break;
            case MAKERESULT(ROCK,PAPER):
                printf("player 2 wins, paper covers rock\n");
                break;
            case MAKERESULT(SCISSORS, PAPER):
                printf("player 1 wins, scissor cuts paper\n");
                break;
            case MAKERESULT(SCISSORS,ROCK):
                printf("player 2 wins, rock crushes scissors\n");
                break;
            case MAKERESULT(PAPER, ROCK):
                printf("player 1 wins, paper covers rock\n");
                break;
            case MAKERESULT(PAPER,SCISSORS):
                printf("player 2 wins, scissor cuts paper\n");
                break;
            case MAKERESULT(ROCK,ROCK):
            case MAKERESULT(SCISSORS, SCISSORS):
            case MAKERESULT(PAPER, PAPER):
                printf("Draw\n");
                break;
            default: 
                printf("Wrong input\n");
                break;
        }
    }
    return 0;
}
唐向荣
2023-03-14

当你有一个if/else链时,只会执行其中一个块,它将是第一个条件为真的块(如果没有条件,则是最后的else)。

为了更好地说明,请使用以下代码:

if (condition1) {
  // do thing 1
} else if (condition2) {
  // do thing 2
} else if (condition3) {
  // do thing 3
} else {
  // do thing 4
}

这实际上是多个链接在一起的if语句。如果我们添加一些多余的大括号,就会更清楚地看到这实际上是如何工作的:

if (condition1) {
  // do thing 1
} else {
    if (condition2) {
      // do thing 2
    } else {
        if (condition3) {
            // do thing 3
        } else {
            // do thing 4
        }
    }
}

从这里,应该很明显,只有满足的第一个条件才会被输入。

这就是为什么从不输入strcmp(player1,player2)=0块的原因。如果player1输入有效字符串,则将输入前3个条件中的一个,而不会输入其他条件。

您需要移动strcmp(player1, player2)==0条件,并在前3个方块中的每一个方块中添加ore。您还可以删除检查玩家2的值的外部方块,因为它们已经在检查玩家1的值的方块中进行了计算。

    if(strcmp(player1, "rock") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if (strcmp(player2, "scissors") == 0)
            printf("player 1 wins, rock crushes scissors\n");
        else if(strcmp(player2, "paper") == 0)
            printf("player 2 wins, paper covers rock\n");
        else
            printf("incorrect input, try again\n");
    }
    else if(strcmp(player1, "scissors") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if(strcmp(player2, "paper") == 0)
            printf("player 1 wins, scissor cuts paper\n");
        else if(strcmp(player2, "rock") == 0)
            printf("player 2 wins, rock crushes scissors\n");
        else
            printf("incorrect input, try again\n");
    }
    else if(strcmp(player1, "paper") == 0)
    {
        if(strcmp(player1,player2) == 0)
            printf("nobody wins, let’s sing it again!\n");
        else if(strcmp(player2, "rock") == 0)
            printf("player 1 wins, paper covers rock\n");
        else if(strcmp(player2, "scissors") == 0)
            printf("player 2 wins, scissor cuts paper\n");
        else
            printf("incorrect input, try again\n");
    }
    else
    {
        printf("incorrect input, try again\n");
    }
    
 类似资料:
  • 作为概念证明,将模板字符串语法与Object.Prototype语法一起使用确实有效: 我是不是漏掉了一些明显的东西?我觉得示例2在逻辑上应该工作,但我对输出感到困惑。我猜这是一个范围问题,但我被输出“是一个未定义的”抛了出来。 ES6小提琴

  • 本文向大家介绍实现strcmp 函数。相关面试题,主要包含被问及实现strcmp 函数。时的应答技巧和注意事项,需要的朋友参考一下 【参考答案】 int m ystrcmp(const c har* str1, const char* str2) { assert((str1 != NULL) && (str2 != NULL)); int r et = 0; while (!(ret = (un

  • 问题内容: 以下代码从文件加载html内容我使用了该线程 请让我知道问题是什么?我希望这是愚蠢的:) 编辑:正确的代码 谢谢乔恩和大家! 问题答案: callback()函数在响应到达时运行,并且不在方法范围内运行,因为该函数已经结束。 您可以在调用中使用属性来设置回调函数的上下文:

  • 我正在将一些存储过程从Sybase TSQL转换为Oracle PL/SQL,我已经遇到了一个我正在努力解决的问题! 命令-DECLARE中从第17行开始出错 t INT:=0;t_error异常;v_line VARCHAR2(100); 开始 实际上,我正在尝试用PL/SQL版本替换以下TSQL:

  • 问题内容: 嗨,我尝试在POST请求中尝试PHPPost请求,认为这可能对我有用,下面给出了我的代码 形成index.php文件,而index2.php是同一目录中的另一个文件,当我打开页面时,我的error.log文件中出现以下错误 我想要做的是我有一个发送发帖请求的预订表格,然后我想处理发帖值并再次将发帖请求发送到贝宝 问题答案: 您需要为php安装CURL支持。 在Ubuntu中,您可以通过

  • 问题内容: Oracle-函数不起作用 所以我不知道我在做什么错。我已经花了几个小时了,非常感谢您的帮助。 因此,基本上我有2个表,一个表被称为主列表,它是一个学生列表,另一个表被调用,它基本上具有该学生所注册课程的列表。 因此,我编写了一个函数,用于将登录学生的用户名(在本例中为)与学生列表进行比较,并确保登录用户是学生。然后,它将与表进行比较,以查找用户注册的任何程序。因此,从本质上讲,当我(