0

为了在 xcode 中开发计算器,我使用 ac 类将中缀转换为后缀表达式及其求值。但是我的视图控制器类中有一个 NSString,我需要将此 NSString 传递给发生转换和评估的 C 类。我怎样才能做到这一点?

4

3 回答 3

0

这很容易,因为您可以使用 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)]];
        }
    }
于 2012-11-11T14:49:08.140 回答
0

我认为您需要将 NSString 转换为 cString。它可以通过

[str UTF8String]
于 2012-11-07T09:50:39.623 回答
0

假设您有一个NSMutableArray包含NSString对象,并且您想将其转换为包含 C 字符串的 C 数组,您需要为适当大小的 C 数组分配内存(例如,如果您想要一个终止符,char *则 + 的计数可能额外增加 1 个数组,否则您需要在任何地方传递数组的元素计数)。然后对于 的每个元素,用对象返回的 C 字符串填充 C 数组中的相应索引。NSMutableArrayNULLNSMutableArrayUTF8StringNSString

请注意,返回的 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并使用NSMutableArrayfor 迭代,等等。但是有人可能想知道,你可以用 C 字符串做什么,而你不能直接用NSStrings 做。

于 2012-11-07T10:55:12.527 回答