2012-11-07 58 views
0

在xcode中開發計算器我使用c類將中綴轉換爲後綴表達式及其評估。但我在我的視圖控制器類中有一個NSString,我需要將這個NSString傳遞給轉換和評估發生的C類。我怎樣才能做到這一點?如何將NSMutableArray對象轉換爲xcode中的常量字符

+1

在你的問題的標題中提到的NSMutableArray進來了嗎? – Abizern

回答

0

我認爲你需要將NSString轉換爲cString。它可以通過

[str UTF8String] 
+0

我的要求是假設我的字符串是s = @「11 + 12」。然後在C類中,當它需要第一個字符時它應該得到11,但現在得到的是1.如何解決這個問題 – Ashok

+0

獲得字符串後,你必須解析它使用自己的邏輯,如字符串分割字符「+」得到11和12. – Gangcil

+0

我有這些11,+和12在一個NSMutable陣列。現在我怎麼能轉換這個或傳遞給c類的地方,函數接收一個const char數據類型。 – Ashok

0

假設你完成已含有NSString對象的NSMutableArray,並且希望將其轉換爲C數組含有C字符串時,需要分配內存的適當大小的char * C數組(例如,如果你想爲數組設置一個NULL終止符,則可以計算NSMutableArray +也許是1個額外值,否則你需要隨處傳遞數組的元素數)。然後對於NSMutableArray的每個元素,使用由NSString對象的UTF8String返回的C字符串填充C數組中的對應索引。

注意,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函數從否則Objective-C的以個體的字符串作爲const char *代碼,你不需要做任何複雜的事情,只需要用UTF8String即時轉換每個字符串,並使用NSMutableArray進行迭代等等。但是後來人們可能會懷疑wh在那裏你可以用C字符串做,你不能直接使用NSString s。

+0

(檢查錯誤,爲簡潔起見。) – Arkku

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)]]; 
     } 
    } 
相關問題