0

xcodeで計算機を開発するために、中置式を後置式に変換するためのacクラスとその評価を使用しています。しかし、ViewコントローラークラスにNSStringがあり、このNSStringをCクラスに渡して、変換と評価を行う必要があります。これどうやってするの?

4

3 に答える 3

0

NSStringをcStringに変換する必要があると思います。それはによって行うことができます

[str UTF8String]
于 2012-11-07T09:50:39.623 に答える
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

NSMutableArray包含オブジェクトがNSStringあり、これを C 文字列を含む C 配列に変換したい場合、適切なサイズの C 配列にメモリを割り当てる必要があります(たとえば、ターミネータが必要な場合char *は + 多分 1 エクストラのカウント)。それ以外の場合は、配列の要素数をどこにでも渡す必要があります)。次に、 の各要素について、C 配列内の対応するインデックスに、オブジェクトから返された C 文字列を設定します。NSMutableArrayNULLNSMutableArrayUTF8StringNSString

によって返される C 文字列UTF8Stringは「自動解放」されることに注意してください。したがって、現在の自動解放コンテキストよりも長くそれらを保持する必要がある場合は、それらを複製する必要があり (例: strdup)、次にfreeそれら (および C 配列、必要な 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

edit : もちろん、const char *Objective-C コードのように個々の文字列を取得する C 関数を呼び出したいだけの場合は、これほど複雑なことをする必要はありません。各文字列をオンザフライで変換し、 for 反復UTF8Stringを使用するだけです。など。しかし、 sNSMutableArrayでは直接できなくても、C 文字列でできることは何なのか疑問に思うかもしれません。NSString

于 2012-11-07T10:55:12.527 に答える