Каков размер строки двойного указателя? - PullRequest
3 голосов
/ 14 марта 2012

Предположим, у меня есть char **argv.Как определить его размер?

У меня есть строка - пример будет: sleep 30 &, который содержится в argv.Я хотел бы иметь возможность доступа к последнему массиву в *argv.В этом случае последний массив содержит &.Как я могу получить к нему доступ?strlen(argv) не работает должным образом.sizeof(), очевидно, не будет работать должным образом, потому что **argv является указателем.

Примечание: я не говорю о **argv в качестве аргумента в main (), поэтому у меня нет argcили любой другой показатель длины строки.

Ответы [ 4 ]

5 голосов
/ 14 марта 2012

EDIT: отредактировано для работы с пользовательским массивом строк. Указатель NULL указывает конец массива. Хотя при этом объявляется массив из 4 строк, этот метод может использоваться с массивом динамического размера.

#include <stdio.h>

int main()
{
    char* custom[4] = { "sleep", "30", "&", NULL };
    int last;
    for (last = 0; custom[last + 1]; last++);
    printf("%i - %s\n", last, custom[last]);
    return 0;
}

// ./a.out
// > 2 - &

Чтобы это работало для вас, вам нужно отредактировать вашу программу, чтобы явно включить дополнительную строку NULL в ваш char** при ее создании. Без этого индикатора адрес после последней строки не обязательно будет NULL, поэтому вы можете включить мусор в счетчик или вызвать ошибку сегментации.

0 голосов
/ 14 марта 2012
   char *argv[] = {"abc","123","xya"};

    //prints the last string
   printf("%s",a[strlen(*a)-1]);

// если вы уверены, что массив строк заканчивается на NULL

   char *temp = 0 ;
   while(*argv){
        temp = *argv;
        (*argv)++;
   }
  //temp has the last string
0 голосов
/ 14 марта 2012

Вам может понадобиться использовать strtok для токенизации аргументов и работы с ними до тех пор, пока у вас не будет последнего.

Ссылка на strtok .

0 голосов
/ 14 марта 2012

Передача в счетчике, например, argc, является наиболее распространенным видом использования, но вы говорите, что у вас его нет.

Тогда обычный способ состоит в том, чтобы последний элемент argv указывал на NULL, чтобы указать, что это последний элемент массива.

int argc = 0;
while (*argv++) {
 argc++;
}
...