命令行C程序到Swift

时间:2015-12-15 15:32:01

标签: ios c swift command-line-interface

我有命令行C game的源代码,等待用户的stdin,并输出stdout。我想将文本字段中的输入提供给此main代码的C,并将输出作为文本区域字段。例如。

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

}

从示例here开始,我应该执行以下操作:

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

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

我怎样才能调用main function并保持活着并继续给它参数,使其成为command line

3 个答案:

答案 0 :(得分:2)

我会使用TextArea和TextField设置您的应用程序,并提供printf和scanf的替代方法,可以将文本添加到文本区域或从文本字段中获取已发送的文本(可能使用“Enter”UIButton)。然后你可以编译C代码并从Swift中调用它。 Objective C实际上是C方式,所以你应该能够通过一点改动来运行它。

为了让代码运行,你可能不得不让这个代码在它自己的线程中运行,并跳过一些箍来让这些调用正常运行,但它应该是可行的。

答案 1 :(得分:0)

我认为这不是正确的做法。 main的目的是基本上启动应用程序,然后控制传递给Application Delegate并从那里继续。从Apple的文档:“除了少数例外,你永远不应该改变Xcode提供的主要功能的实现。”https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html

还有其他方法可以将C与Objective-C混合使用。如果你需要调用C,那么最好的位置可能就是需要这些数据的视图。这些链接可能有所帮助:Mixing C functions in an Objective-C class

答案 2 :(得分:0)

请勿在您的过程中调用该功能。

相反,将您的命令行游戏作为一个单独的进程执行,以便您可以将它的stdin / stdout连接到管道。 然后,您可以将文本字段的内容发送到一个管道中,并从另一个管道读回结果。

看看例如http://practicalswift.com/2014/06/25/how-to-execute-shell-commands-from-swift/