1

我正在尝试将 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]”,所以我显然没有正确转换参数。

4

2 回答 2

4

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

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

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

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

第一行创建一个字符指针数组(更准确地说,是 C 字符串),最后包含 ISO C 标准规定的 NULL。

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

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

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

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

于 2012-06-05T04:59:12.773 回答
2

我不了解你,但我认为在你对“”的函数调用中“”的结果不会(int)(const char *)[pathToFile UTF8String]copyfiles2或 3。你在哪里找到了基于此实现的示例代码?

无论如何,将那个疯狂的演员更改为常数 2(因为你所经过的只是一条路径),看看你是否有更好的结果。

于 2012-06-05T04:58:51.967 回答