2012-11-07 36 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)]]; 
     } 
    } 
相关问题