【问题标题】:Why won't a chunck of this program run in Linux but will on Windows?为什么这个程序的一部分不能在 Linux 上运行而在 Windows 上运行?
【发布时间】:2016-10-23 23:44:17
【问题描述】:

所以我不得不制作一个小游戏,让玩家选择一个数字,看看他们是否猜出计算机选择了什么。它有 2 名玩家,每个人都可以轮到对方。 其中一个规定是我的教授正在运行一个 linux 操作系统,并说如果它不能在那个操作系统上运行,那就是洗了。当我在代码块中运行代码时,可以找到并完成它应该做的事情。如果玩家通过并显示输出消息并切换回合。

当我在 linux 服务器上运行代码时,它总是将 playTurn()turnInput 评估为“PASS”以外的东西,这会将 if(strcmp(turnInput, passValue) == 1) 返回为 false 并移至 int turnInputNum = atoi(turnInput);

当我在 Windows 上的代码块上运行它时,它很好,并且完全按照它应该做的。当我编译它时,我没有收到任何警告,而且 linux 本身就是一个我以前从未处理过的操作系统。它是否有理由传递该代码?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdbool.h>

struct player{
    int passNum;
    int currentPassNum;
    bool myTurn;
};
    struct player player1;
    struct player player2;



    int turn = 1; //holds the games current turn
    int input; //holds the number input by player to indicate which player it is
    int RN; //holds Random Number
    int actualNum = -1; //signals completion of game by ending while loop

    void playTurn(void);
int main() {

    player1.currentPassNum = 0;
    player1.passNum = 0;
    player1.myTurn = true;
    player2.currentPassNum = 0;
    player2.passNum = 0;
    player2.myTurn = false;

    RN = generateRandom();


    while(RN != actualNum){
        printf("\nEnter Player Number: ");
        scanf("%d", &input);
        if(input == turn){
            playTurn();
            if(turn == 1 && player1.myTurn == false){
                turn = 2;
            }
            else{
                turn = 1;
            }
        }
        else{
            printf("You have to wait your turn");
        }

    }



  return 0;
}

int generateRandom(){
    int n;

    srand(time(NULL));

    n = rand() % 100 + 1;

    return n;
}

void playTurn(){
    char turnInput[4];
    char passValue[4] = "PASS";
    int passes;

    printf("Enter your guess: ");
    scanf("%s", &turnInput);
        if(strcmp(turnInput, passValue) == 1){  <---- not running when PASS
            if(input == 1){
               if(player1.currentPassNum > 0){
                player1.currentPassNum = 0;
                player1.myTurn == true;
                printf("You may not pass!");
                return;
               }
               else{
                passes = player1.passNum;
                player1.passNum = player1.passNum + 1;
                player1.currentPassNum = 1;
                player1.myTurn = false;
                printf("Player 1 Passes to Player 2");
                return;
               }
            }
            if(input == 2){
                if(player2.currentPassNum > 0){
                player2.currentPassNum = 0;
                printf("You may not pass!");
                return;
               }
               else{
                passes = player2.passNum;
                player2.passNum++;
                player2.currentPassNum++;
                printf("Player 2 Passes to Player 1");
                return;

               }
            }
            if(passes > 3){
                printf("You can't pass anymore");
                return;
            }
        }
        int turnInputNum = atoi(turnInput); <---- Jumping to here every time
        if(turn == 1){
           player1.currentPassNum = 0;
           player1.myTurn = false;
        }
        else{
            player2.currentPassNum = 0;
            player1.myTurn = true;
        }
        if(turnInputNum > RN){
            printf("Too High");
            return;
        }
        if(turnInputNum < RN){
            printf("Too Low");
            return;
        }
        if(turnInputNum == RN){
            printf("CORRECT");
            actualNum = RN;
            return;
        }

}

【问题讨论】:

  • 谁说要使用if(strcmp(turnInput, passValue) == 1)strcmp 只处理&lt;0==0&gt;0。没有具体提及返回码 1。这当然不是一个安全且可移植的假设。
  • char passValue[4] = "PASS"; --> char passValue[5] = "PASS";
  • @John3136 谢谢你的工作。这实际上是我用 C 编写的第一个程序,并且不确定很多功能。如果您回答,我会将其标记为正确

标签: c linux


【解决方案1】:

strcmp 有 3 个可能的返回码:

  1. &lt;0
  2. ==0
  3. &gt;0

没有特定的==1,因此假设您可以说==1 是不安全或不便携的。请改用&gt;0

这实际上是可移植性和移植问题的一个很好的例子 - 从问题来看,==1 显然适用于 Windows,但将该代码移植到 Linux 并停止。我不确定 Windows 是否记录了“-1、0、1”,或者它是否只是一个碰巧起作用的假设,但正如 OP 发现的那样:“Gotcha!!”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2019-10-04
    • 2019-03-05
    • 2021-03-13
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多