xcodeで計算機を開発するために、中置式を後置式に変換するためのacクラスとその評価を使用しています。しかし、ViewコントローラークラスにNSStringがあり、このNSStringをCクラスに渡して、変換と評価を行う必要があります。これどうやってするの?
3 に答える
NSStringをcStringに変換する必要があると思います。それはによって行うことができます
[str UTF8String]
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)]];
}
}
NSMutableArray
包含オブジェクトがNSString
あり、これを C 文字列を含む C 配列に変換したい場合、適切なサイズの C 配列にメモリを割り当てる必要があります(たとえば、ターミネータが必要な場合char *
は + 多分 1 エクストラのカウント)。それ以外の場合は、配列の要素数をどこにでも渡す必要があります)。次に、 の各要素について、C 配列内の対応するインデックスに、オブジェクトから返された C 文字列を設定します。NSMutableArray
NULL
NSMutableArray
UTF8String
NSString
によって返される 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