命令行C程序转换为Swift

15

我有一份命令行C语言游戏的源代码,它等待用户输入的stdin,并输出stdout。我想从文本框中提供输入,然后将输出显示在文本区域中。

int mainer(int argc, char **argv) {
    int i;
    int hitme;
    char ch;
    prelim();

    if (argc > 1) { // look for -f option
        if (strcmp(argv[1], "-f")== 0) {
            coordfixed = 1;
            argc--;
            argv++;
        }
    }


    if (argc > 1) {
        fromcommandline = 1;
        line[0] = '\0';
        while (--argc > 0) {
            strcat(line, *(++argv));
            strcat(line, " ");
        }
    }
    else fromcommandline = 0;
 // some other code

}

根据这个示例,我应该执行以下操作:

let args = [" ", "regular", "short", ""]

var cargs = args.map { strdup($0) }
let result = mainer(Int32(args.count), &cargs)
for ptr in cargs { free(ptr) }

我该如何调用主函数,并保持其一直运行,并不断向其提供参数以使其像命令行一样工作。

3个回答

2
我建议您使用一个TextArea和一个TextField来设置您的应用程序,并提供替代printf和scanf的方法,这些方法可以将文本添加到文本区域或从文本字段发送文本(可能需要使用“Enter”UIButton)。然后,您可以编译C代码并从Swift调用它。Objective C实际上是C语言的底层实现,因此只需稍加修改就可以使其运行。
为了使代码运行起来,您可能需要将此代码放在自己的线程中,并通过一些技巧使这些调用正确地运行,但这应该是可行的。

0

我认为这不是做这件事的正确地方。main函数的目的是启动应用程序,然后控制传递到应用程序委托并从那里继续进行。根据Apple的文档:“除了少数例外情况外,您永远不应更改Xcode提供的main函数的实现。” https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

有其他方法将C与Objective-C混合使用。如果需要调用C,最好的位置可能是需要此数据的视图。这些链接可能会有所帮助:在Objective-C类中混合C函数


我并不是试图替换主函数,这个函数在主应用程序中,我只是为了参考而将其称为主函数。 - MasterWizard

0

我无法编译代码,因为应用商店不允许编译后的程序。 - MasterWizard
但是我不能在项目中包含可执行文件。 - MasterWizard
那么你有两个选择:
  1. 将C部分链接到您的程序中,并在其自己的进程中执行它(fork,设置管道,然后在子进程中调用您的例程)。我认为这在iOS上不起作用。
  2. 重构C部分,以便您获得一个函数,该函数接受输入字符串并返回输出字符串。
- Tali
Ahmed,你提交到商店的所有内容都必须编译。问题在于你不能在你的 Xcode 项目中编译/构建应用程序。正如 Tali 指出的那样,你可以调用一个 shell 脚本来从命令行获取输入。你也可以将你的 C 代码作为库包含在主应用程序中调用,但这更困难。 - xdeleon
它已经可以工作了,但我的主要问题是让它等待参数。 - MasterWizard
@xdeleon,你说的shell脚本是什么意思?如果项目中没有可执行文件,我该怎么做呢? - MasterWizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接