Как правильно передать этот массив строк c?

У меня есть массив C-String, объявленный как:

char *argv[MAXARGS];

MAXARGS в основном просто сообщает нам, сколько строк c находится в массиве для целей индексации. Я хочу передать его этой функции ниже...

int builtin_cmd(char **argv)

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

    char *argv[MAXARGS];

    builtin_cmd(argv);

но как только я попаду в функцию builtin_cmd и попытаюсь распечатать, используя

printf("%s\n", argv[0]);

он ничего не печатает.... но когда я делаю это перед вызовом функции...

char *argv[MAXARGS];
printf("%s\n", argv[0]);
//builtin_cmd(argv);

он отлично напечатает первую строку C в массиве строк c. Я думаю, что я неправильно передаю структуру, и я хотел бы знать, как правильно передать ее функции.

РЕДАКТИРОВАТЬ:

int builtin_cmd(char **argv);
int main()
{
    char *argv[128];
    //put 'quit' into argv[0]..
    printf("%s\n", argv[0]); //prints 'quit'
    builtin_cmd(argv);
}
int builtin_cmd(char **argv)
{
    printf("%s\n", argv[0]); //prints nothing
}

Проблема, опять же, в том, что я не могу получить argv в функцию. Он также компилируется без ошибок или предупреждений.


person user3040019    schedule 09.02.2014    source источник
comment
Пожалуйста, опубликуйте минимальный реальный пример, демонстрирующий проблему.   -  person Kerrek SB    schedule 09.02.2014
comment
Как написано, не вижу причин, по которым это не работает. Опубликуйте настоящий код, демонстрирующий проблему.   -  person WhozCraig    schedule 09.02.2014
comment
Вы уверены, что прототип встроенной_команды правильный? Обычно можно ожидать что-то вроде builtin_cmd(int argc, char* argv[]) . Иначе как встроенная команда узнает, сколько аргументов вы передаете?   -  person Floris    schedule 09.02.2014
comment
Подобная концепция более подробно описана по этой ссылке. stackoverflow.com/questions/21648346/   -  person mahendiran.b    schedule 09.02.2014
comment
@WhozCraig отличная работа, показывающая, что это не ваша проблема с рабочим кодом, который реализует то, что показано в вопросе. Я согласен с вашим выводом - все, что не так с кодом, здесь не показано.   -  person Floris    schedule 09.02.2014


Ответы (3)


Вы не показали, как вы инициализируете массив, и это важная часть.

#include <stdio.h>

static void builtin_cmd(char **argv)
{
     while (*argv != NULL)
         printf("%s\n", *argv++);
}

int main(void)
{
    char *argv[] = { "abc", "def", "ghi", NULL };
    builtin_cmd(argv);
    return 0;
}

Этот код использует контрольное значение, нулевой указатель, чтобы отметить конец данных. Альтернативой является передача количества строк в массиве в качестве отдельного аргумента. Когда вы используете int main(int argc, char **argv), вы фактически используете оба механизма; argv[argc] == NULL так что есть счетчик, а затем дозорное значение.

person Jonathan Leffler    schedule 09.02.2014

Вы пытаетесь передать массив указателей на символы в функцию, поэтому объявление вашей функции должно быть builtin_cmd(char* argv[]). Вот пример примера передачи массива указателей в функцию

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fill_strings(char *str[], int nstrings)
{
    int i;
    for ( i=0; i < nstrings; i++)
        strcpy(str[i], "hello world");
}

void print_strings(char *str[], int nstrings)
{
    int i;
    for (i=0; i < nstrings; i++)
        printf("string %d: %s\n", i, str[i]);
}

int main(void)
{
    char *index[10];
    int i;
    for(i=0; i<10; i++)
    {
        index[i] = malloc(20);
    }
    fill_strings(index, 10);
    print_strings(index, 10);

    return 0;
}
person Santhosh Pai    schedule 09.02.2014

Если вы передаете свой ввод в командной строке, вам нужно сообщить компилятору, что вы используете параметры, которые передаются в main из среды выполнения.

int main(int argc, char **argv)
{

Это должно позволить вам правильно передать «quit» в качестве первого параметра. В противном случае, как говорят другие, важно, как вы заполняете «вектор C».

person jduck    schedule 09.02.2014