为了在 xcode 中开发计算器,我使用 ac 类将中缀转换为后缀表达式及其求值。但是我的视图控制器类中有一个 NSString,我需要将此 NSString 传递给发生转换和评估的 C 类。我怎样才能做到这一点?
3 回答
这很容易,因为您可以使用 NSString 的 UTF8String 方法,但是您必须处理内存分配:分配一个块以包含字符串。选择是否将其包装到 NSData 以便在离开池块时自动释放,或者如果手动释放它:
@autoreleasepool
{
NSArray* strings= @[ @"Hello", @"Hey" ]; // Your strings
// This could be also a NSMutableArray if you need it
NSMutableArray* cstrings=[NSMutableArray new]; // C strings
for(NSString* string in strings) // Iterate over all the strings
{
const char* temp=[string UTF8String]; // Get C string
const unsigned long length=strlen(temp); // Allocate memory for it
char* string=(char*)malloc((length+1)*sizeof(char));
strcpy(string,temp); // Copy it
// Store it inside NSData
[cstrings addObject: [NSData dataWithBytesNoCopy: string length: (length+1)*sizeof(char)]];
}
}
我认为您需要将 NSString 转换为 cString。它可以通过
[str UTF8String]
假设您有一个NSMutableArray
包含NSString
对象,并且您想将其转换为包含 C 字符串的 C 数组,您需要为适当大小的 C 数组分配内存(例如,如果您想要一个终止符,char *
则 + 的计数可能额外增加 1 个数组,否则您需要在任何地方传递数组的元素计数)。然后对于 的每个元素,用对象返回的 C 字符串填充 C 数组中的相应索引。NSMutableArray
NULL
NSMutableArray
UTF8String
NSString
请注意,返回的 C 字符串UTF8String
是“自动释放的”,因此如果您需要将它们保留比当前自动释放上下文更长的时间,您需要复制它们(例如,strdup
),然后复制它们free
(以及 C 数组,您需要free
无论如何)在你完成它们之后。
例如:
#include <Foundation/Foundation.h>
#include <stdio.h>
#include <string.h>
void printCStringsInArray(const char **arr) {
int i = 0;
while (*arr) { printf("%d: %s\n", i++, *arr++); }
}
int main () {
const char **carr;
@autoreleasepool {
NSMutableArray *arr;
const char **p;
arr = [NSMutableArray arrayWithObjects:@"11", @"+", @"12", nil];
p = carr = malloc(sizeof(*carr) * ([arr count] + 1));
for (NSString *s in arr) {
*p++ = strdup([s UTF8String]);
}
*p = NULL; // mark the end of carr
}
printCStringsInArray(carr);
{ // free the C strings and array
const char **p = carr;
while (*p) { free(*p++); };
free(carr);
}
return 0;
}
这打印:
0: 11
1: +
2: 12
编辑:当然,如果你只是想调用一些 C 函数,const char *
从你的其他 Objective-C 代码中获取单个字符串,你不需要做任何复杂的事情,只需动态转换每个字符串UTF8String
并使用NSMutableArray
for 迭代,等等。但是有人可能想知道,你可以用 C 字符串做什么,而你不能直接用NSString
s 做。