如何将我的 Windows C 程序转换为在 Linux 系统上运行?

Posted

技术标签:

【中文标题】如何将我的 Windows C 程序转换为在 Linux 系统上运行?【英文标题】:How can I convert my Windows C program to run on a Linux system? 【发布时间】:2021-06-09 04:34:54 【问题描述】:

我想将以下程序转换为在 linux 系统上运行以完成我的学校作业。我正在努力奋斗,因为 linux 计算机实验室由于 covid 而关闭。所以,我在我的 Windows 电脑上编写了我的作业。我今天可以访问,但由于多个错误而无法运行。我可以做些什么来转换我的代码以使其与 linux 兼容?

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






char ch;

#define NUMROWS 6
#define NUMCOLS 6
int i, j;

char str1[42] = 'S', '#', '#', '#', '#', '#', '\n', '.', '.', '.', '.', '.', '#', '\n', '#', '.', '#', '#', '#', '#', '\n', '#', '.', '#', '#', '#', '#', '\n', '.', '.', '.', '#', '.', 'G', '\n', '#', '#', '.','.','.','#','\n';


main()



    
    
    char response[10];
    char response2[10];
    char yes;
    char no;
    char ready;
    char notready;
    
    printf("Do you want to play the maze game? yes|no : \n");
    scanf("%s", &response);
    
    if (!strcmp(response, "yes"))
    
    printf("\n");
    printf("Game will begin!");
    printf("\n");
    printf("\n");
    
    printf("Maze Board Example: \n");
    printf("S##### \n");
    printf(".....# \n");
    printf("#.#### \n");
    printf("#.#### \n");
    printf("...#.G \n");
    printf("##...# \n");
    printf("\n");
        
    printf("Intstructions:");
    printf("Are you ready to play? ready|no \n");
    scanf("%s", &response);
    
    if (!strcmp(response, "ready"))
    
        printf("playing...");
        

        system("cls");



        while(1)
        
            mazeGo();
        
    
    

    
    
    
    
    
    
    if (!strcmp(response, "no"))
    
        printf("\n");
        printf("Game will exit");

    
    
    return 0;
    
    
    
    


    
    
void mazeGo()



    str1[0]= '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[7] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[8] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[9] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[10] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[11] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[15] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[22] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[28] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[29] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[30] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[37] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[38] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[39] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[32] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    str1[33] = '+';
    printf("%s", str1);
    sleep(1);
    system("cls");
    
    printf("\n You win!");
    
    exit(0);







【问题讨论】:

如果您可以将错误(消息)添加到您的问题中,那将会很有帮助。乍一看,system("cls") 通常无法在 Linux 上运行。它是 Windows 的 CMD.EXE 的内置命令,它运行您在 Windows 上传递给 system() 的“字符串”。在 Linux 上,它会(为了争论)是一个“bourne-shell”,所以试试system("clear")。 YMMV。 为什么会有这么多不必要的空行? 缩进也不一致。让人难以阅读。 无关:使用在 Windows 主机中运行的 Linux virtual machine 【参考方案1】:

首先,您应该将返回类型 void 添加到您的主函数中。

void main()...

然后您尝试执行“cls”命令,这在 linux 中不起作用,因为它是 Windows 特定的命令。

【讨论】:

correct return type for mainint,独立于系统。 (并且 OP 在最后执行return 0,因此该函数不是无效的。) main() ... 没有返回类型至少会被解释为int main() ...。换句话说,这个建议使代码比现在更糟糕:-(【参考方案2】:

我无法想象您在 Windows 上没有收到警告...

...
printf("Do you want to play the maze game? yes|no : \n");
scanf("%s", &response);
...

=> 格式“%s”需要“char ”类型的参数,但参数 2 的类型为“char ()[10]

应该是scanf("%s", response);或者更好:scanf("%9s", response);

这足以调用 Undefined Behavior 并让程序顺利运行,随时崩溃或提供不一致的输出......并且错误在程序中重复......

system("cls");

=> 警告:函数“系统”的隐式声明

当然不是错误,但最佳实践建议在使用函数之前声明函数。你应该使用#include &lt;stdlib&gt;

void mazeGo()

=> 警告:“mazeGo”的类型冲突

标识符最初是在mazeGo(); 遇到的,并被隐式声明为int mazeGo()。您应该在 main 之前有一个 void mazeGo(); 声明

还有一个数字或未使用的变量。同样,这不是错误,但在代码中留下未使用的变量可能会隐藏拼写错误并使未来的维护更加困难。

除此之外,system("cls") 只会在 Windows 上清除屏幕。在 Linux 上,system 启动的 shell 会报错未知命令,但它不应中止程序。

TL/DR:

    警告不容忽视 如果程序在 Windows 上是正确的,它会在 Linux 上运行(屏幕清除除外)

【讨论】:

以上是关于如何将我的 Windows C 程序转换为在 Linux 系统上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的 Java 程序转换为 .exe 文件?

Mysql Workbench 将表和列转换为在 Linux (AWS -EC2) 中不起作用的小写

如何将应用程序转换为在中等信任级别下运行?

如何将我的应用程序放入 iPhone 3G?

为啥 QProcess 将我的参数中的“=”转换为空格

如何将(aiff)文件转换为在 Windows 操作系统上运行的任何格式(.asf、.asx、.avi、.wav、.wax、.wma、.wm、.wmv)?