Iphone 如何将字符串从Objective-C传递给C函数并返回值?
我有一个Objective-C视图控制器类,我试图从中调用straight-C(而不是Objective-C)函数。我想通过引用传入一个字符串变量,在C函数中设置它的值,然后回到我的视图控制器中,我想把它转换成一个普通的NSString对象 由于无法直接传入NSString对象,因此需要创建并传入Iphone 如何将字符串从Objective-C传递给C函数并返回值?,iphone,objective-c,c,Iphone,Objective C,C,我有一个Objective-C视图控制器类,我试图从中调用straight-C(而不是Objective-C)函数。我想通过引用传入一个字符串变量,在C函数中设置它的值,然后回到我的视图控制器中,我想把它转换成一个普通的NSString对象 由于无法直接传入NSString对象,因此需要创建并传入char指针或char数组,然后在函数返回后将其转换为NSString对象 有人能给我举一个简单的代码示例来说明如何做到这一点吗?我不擅长Objective-C或常规C,因此操纵字符串对我来说非常困难。
char
指针或char
数组,然后在函数返回后将其转换为NSString对象
有人能给我举一个简单的代码示例来说明如何做到这一点吗?我不擅长Objective-C或常规C,因此操纵字符串对我来说非常困难。请查看
NSString
文档中的以下内容:
– cStringUsingEncoding:
– getCString:maxLength:encoding:
– UTF8String
+ stringWithCString:encoding:
也许是这样的
bool doSomethingToMyString(const char* originalString, char *buffer, unsigned int size)
{
bool result = 0;
if (size >= size_needed)
{
sprintf(buffer, "The new content for the string, maybe dependent on the originalString.");
result = 1;
}
return result;
}
...
- (void) objectiveCFunctionOrSomething:(NSString *)originalString
{
char myString[SIZE];
if (doSomethingToMyString([originalString UTF8String], myString, SIZE))
{
NSString *myNSString = [NSString stringWithCString:myString encoding:NSUTF8StringEncoding];
// alright!
}
}
或者,你知道,类似的东西。好吧,我让它起作用了。这是我的C函数:
int testPassingChar(char buffer[]) {
strcpy(buffer, "ABCDEFGHIJ");
return 0;
}
然后从Objective-C:
char test[10];
int i;
i = testPassingChar(test);
NSString* str = [[NSString alloc] initWithBytes:test length:sizeof(test)
encoding:NSASCIIStringEncoding];
为什么不把你的C函数包装成Objective-C呢
-(NSString*)testPassingCharWithStringLength:(int)whateverLength {
char *test = malloc(sizeof(char) * whateverLength);
//do whatever you need to *test here in C
NSString *returnString = [NSString stringWithUTF8String:test];
free(test);
return returnString;
}
…例如…我的主要问题是将一个字符数组传递到一个C函数中并返回一个值,因此这更像是一个C问题而不是一个Objective-C问题;char*bar=cfunction(foo);NSString*newString=[NSString stringWithCString:bar编码:NSUTF8STRINGENCONDING];如果您真的愿意,您可以传递Obj-C对象并使用纯C操作它们。您尝试使用的函数是做什么的?这是你自己写的还是你在使用别人的代码?我认为
stringWithCString
是不受欢迎的(并不是说这有什么问题)。:)我不确定,但我认为stringWithCString:
不受欢迎,但stringWithCString:encoding:
不受欢迎。不过我可能弄错了。您通常应该避免让函数在不知道缓冲区大小的情况下处理传入的缓冲区。(我所说的“一般”其实是指“总是”。)walkytalky是这么说的。在您的示例中,如果您将“ABCDEFGHIJ”压缩到一个大小为10的缓冲区中,您将从“\0”
终止字符中得到一个缓冲区溢出。@walkytalky:我确实希望传入一个指针,而不是预分配的缓冲区,但上面的代码是我现在唯一能够使用的代码。另外,如果我在C函数中分配缓冲区的大小,那么我必须清理Objective-C中的内存,这对我来说似乎很奇怪。@MusiGenesis:你肯定有缓冲区溢出。它是否会破坏某些重要的内容取决于编译器决定如何在堆栈上排列数组(通常,优化级别会对此产生影响)@MusiGenesis:无论您传入指针还是堆栈分配的数组,不知道长度的问题都是一样的(尽管溢出的后果可能不同)。在Objective-C中使用malloc
/free
进行C风格的动态分配是完全可以接受的——如果您确实需要,可以使用objecty替代方案,但在这种情况下可能是多余的。让你的函数告诉你它需要多少空间,这样你就可以避免使用固定长度。