Objective-C,如何将文件名传递给 C 函数?

标签 objective-c c arguments

我正在尝试将 NSString 传递给 C 函数,尽管它似乎不接受(或忽略)参数。任何帮助将不胜感激 - 谢谢。

int copyfiles(int argc, const char **argv)
{
    if(argc < 2 || argc > 3)
    {
        puts("usage: copy file [outfile]");
        return 1;
    }

    const char *infile = argv[1];
    char *outfile;
    if(argc > 2)
    {
        outfile = strdup(argv[2]);
        expect(outfile, "allocate");
    }
...
}

@implementation MyApplication 

@synthesize window;

    - (void)copy:(NSString *)pathToFile
    {
     NSString *pathToFile = @"/path/to/file";
     copyfiles((int)(const char *)[pathToFile UTF8String],(const char **)[pathToFile UTF8String]);
    }

我没有收到任何错误,但输出显示“用法:复制文件 [outfile]”,所以我显然没有正确转换参数。

最佳答案

查看您对 copyfiles 的调用,特别是为什么您将字符串传递给第一个参数需要整数的函数。

您需要向该函数传递一个参数 count,后跟参数列表的指向指针的指针。

例如,您可以使用以下 C 代码调用它(未经测试,但您应该了解总体思路):

const char *args[] = {"copy", "fromfile", "tofile", NULL};
copyfiles (sizeof(args) / sizeof(*args) - 1, args);

第一行创建了一个字符指针数组(更准确地说,是 C 字符串),包括末尾的 NULL,这是 ISO C 标准规定的。

第二行传递两个参数,第一个是数组的大小减一(列表中“真实”参数的数量),第二个是数组本身。

在您的特定情况下,您似乎使用的是单文件名变体,您应该从以下内容开始:

char *args[3];
args[0] = "copy";
args[1] = [pathToFile UTF8String]; // watch out for auto-release here?
args[2] = NULL;
copyfiles (2, args);

因为您的 C 函数需要类似 main 的行为,其中第一个参数是“程序”名称。

关于Objective-C,如何将文件名传递给 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10891783/

相关文章:

objective-c - 如何有效地从 1 到 50 中选择几个唯一的随机数,不包括 x?

C程序运行时卡住

c++ - 如果两个数字都指向同一位置,则在不使用额外空间的情况下交换两个数字不起作用?

c - C中多次包含头文件错误

r - 在嵌套函数中传递参数以更新默认参数

iphone - 覆盖 - (BOOL)isEqual :(id)object

objective-c - NSTask:由于没有提供 userInfo 字典,如何在结论时获取上下文?

ios - 这种类型转换是否分配地址或数据?

eclipse cdt命令行输入

java - 按参数类型?