我正在尝试将 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/