target-c nsarray для массива c - PullRequest
4 голосов
/ 22 июня 2010

Извините, я даже не знаю, как спросить, так как я полный новичок в C, указатели и тому подобное. Есть функция, которая принимает аргумент: char **arg. Если я напишу этот аргумент так:

char *cargs[] = {"blah", NULL};

и передать его функции:

function(cargs);

это работает. но ... у меня есть NSArray из NSStrings, и мне нужно сделать этот массив из значений из NSArray. Я подумал, что нужно создать массив C с таким же количеством элементов, как у NSArray, и скопировать строки, преобразовав их с cStringUsingEncoding. Но я, честно говоря, понятия не имею, как это сделать, так как меня смущают все эти указатели и тому подобное. Любая помощь будет оценена.

Ответы [ 2 ]

6 голосов
/ 22 июня 2010

Ну, грубые шаги могут быть:

  1. использовать count метод NSArray, чтобы узнать, сколько NSStrings есть в NSArray.

  2. используйте malloc для выделения памяти для карго, что-то вроде этого

    char **cargs = (char **) malloc(sizeof(char *) * count);
    

    в вашем примере, вам может понадобиться еще одно место для NULL, которое будет в конце карго.

  3. использовать цикл и objectAtIndex: NSArray, чтобы получить NSStrings, например NSString * nsstring = [массив objectAtIndex: index];

  4. используйте метод cStringUsingEncoding: , чтобы получить c-строку, лучше сделайте копию

  5. поместите эти указатели c-строки в карго

  6. передать груз в вашу функцию, очистить и освободить вещи, необходимые для.

Это много работы.Потому что смесь c и obj-c.И много ручного malloc и свободных, грязных вещей.Разве вы не можете избежать этого?

- добавить пример кода -

Я не совсем уверен, каково ваше истинное намерение.Надеюсь, это поможет.

void func(char **arg)
{
    int i;
    for(i = 0; arg[i] != NULL; i++) {
        printf("%d=%s\n", i, arg[i]);
}
}
int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *s1 = [NSString stringWithString:@"first"];
    NSString *s2 = [NSString stringWithString:@"second"];
    NSString *s3 = [NSString stringWithString:@"third"];

    NSArray *array = [NSArray arrayWithObjects: s1, s2, s3, nil];
    //by now, we have an NSArray of three NSStrings

    int count = [array count];
    char **cargs = (char **) malloc(sizeof(char *) * (count + 1));
    //cargs is a pointer to 4 pointers to char

    int i;
    for(i = 0; i < count; i++) {
        NSString *s = [array objectAtIndex:i];//get a NSString
        const char *cstr = [s cStringUsingEncoding:NSUTF8StringEncoding];//get cstring
        int len = strlen(cstr);//get its length
        char *cstr_copy = (char *) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0'
        strcpy(cstr_copy, cstr);//make a copy
        cargs[i] = cstr_copy;//put the point in cargs
    }
    cargs[i] = NULL;

    func(cargs);//call the function to do something

    for(i = 0; i < count; i++) {
        free(cargs[i]);
    }
    free(cargs);

    [pool drain];
    return 0;
}
0 голосов
/ 10 марта 2013

@ yehnan ваш ответ БОЛЬШОЙ - особенно потому, что Я думал , что const ** cStyle[arrays] НЕ МОЖЕТ быть создан динамически ... ( Я действительно хотел бы, чтобы где-то былотолько с базовой информацией о C указателях и переменных и дерьме ... Я нахожу, что самые основные "C-примитивы" намного более сбивают с толку, чем что-либо еще ... ) Вот ваш хороший маленький пример, "упакованный" вфункция ... " для детей ... "

char ** cArrayFromNSArray ( NSArray* array ){
   int i, count = array.count;
   char **cargs = (char**) malloc(sizeof(char*) * (count + 1));
   for(i = 0; i < count; i++) {        //cargs is a pointer to 4 pointers to char
      NSString *s      = array[i];     //get a NSString
      const char *cstr = s.UTF8String; //get cstring
      int          len = strlen(cstr); //get its length
      char  *cstr_copy = (char*) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0'
      strcpy(cstr_copy, cstr);         //make a copy
      cargs[i] = cstr_copy;            //put the point in cargs
  }
  cargs[i] = NULL;
  return cargs;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...