Как печатать аргументы argv из основной функции в C?

поэтому я только что узнал, что мы можем дать два аргумента в основную функцию, а именно "argc" и "argv. Однако я не могу понять, что такое argv в этом: int main(int argc, char* argv[]);

является ли argv массивом символов? или это массив указателей, указывающих на персонажей? В любом случае я ищу способ распечатать аргументы, которые пользователь передает этой программе. Это код, который я написал, но он не печатает, так сказать, argv. Что в этом плохого? Думаю, это мое. понимание argv, которое делает этот код неправильным.

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%dn",argc);
    for(i=0;i<argc-1;i++)
    {
        printf("%s",*argv[i]);
    }
    return 0;
}

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

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%dn",argc);
    for(i=1;i<argc;i++)
    {
        printf("%s",argv[i]);
    }
    return 0;
}

и я использую Ubuntu Linux в VMWare на моем ПК с windows 8.1. Это результат, который я получаю. Это просто печать argc и после этого ничего. В чем проблема? Это то, как я компилирую его или что-то в терминале Linux?

The snapshot of my terminal

В выше рисунок, я хочу, чтобы цифры 2,4,5,3 были напечатаны снова, но они не печатаются.

спасибо.

6 ответов


давайте объясним вещи шаг за шагом. Прежде всего, когда вы вызываете свою программу, вызывая что-то вроде...

./my-program arg0 arg1 arg2

вы передаете ему серию из трех аргументов, верно? И каждый аргумент-это строка, верно? Теперь main функция, может иметь один из двух прототипов, как определено стандартом c...

int main(); // Let's not worry about this for now
int main(int argc, char **argv);

идея в том, что main способен обрабатывать аргументы, которые вы предоставили. argc предоставляет ряд аргументов. Если вы заметил, передавая три аргумента,argc - это 4! Это происходит потому, что первый аргумент передается раньше всех остальных,./my-program, и позволяет вашей программе распознавать себя.

, что значит char **argv в смысле? Что-то из формы X* указатель X, да? Итак,char * указатель char и char ** указатель на указатель на char. В C строка - это просто массив с нулевым концом char, и массив может быть "деградация" в указатель. Этот значит, что argv - это массив строк, первая из которых, argv[0], это название программы.

теперь, стандарт C позволяет писать любой "совместимый" прототип main. Например, вы можете написать любой из них...

int main(int argc, const char *const argv[]);
int main(int argc, const char *argv[])
int main(int argc, const char **argv);
int main(int argc, const char *const *const argv);

вам не нужно понимать, что они все означают сейчас, просто это argv - это массив строк, и вы должны никогда изменить строки как исходные main прототип, похоже, доверяет вам. Сейчас, зная, что аргументы начинаются с argv[1] код...

for(i=0;i<argc-1;i++)

означает: "для каждого i в диапазоне от 0 до argc - 1".

    printf("%s",*argv[i]);

означает: "напечатать первый символ iый элемент argv". Почему это должно быть неправильно? Прежде всего, вы печатаете char и говорит printf что это строка. это имеет неопределенное поведение. Затем вы повторяете над первым iче элементами argv. Это средство что первый элемент "non-argument" будет включен в микс, а последний аргумент не будет. Чтобы решить ее, напишите что-нибудь вроде...

for(i = 1; i < argc; i++)

означает: "для каждого i в границах от 1 до argc".

    printf("%s", argv[i]);

означает: "печатать iый элемент argv на stdout.


Is argv массив символов? или это массив указателей, указывающих на персонажей?

argv - это указатель на указатель на char. Когда список аргументов передается через командную строку, то массив char создаются указатели, и каждый из этих указателей указывает на каждый из этих аргументов, хранящихся в виде строк, вместе с именем программы. argv указывает на первый указатель этой char * массив. Следовательно,argv[i] является указателем на char.

                           +--------------------------+
              +----+  +--> | argument 1 (program name)|
argv[0]+----> |    |  |    +--------------------------+
              |  +----+
              +----|       +--------------------------+
              |  +-------> |       argument 2         |
              |    |       +--------------------------+
              +----+
              |  +----+    +--------------------------+
              |    |  +--> |       argument 3         |
              +----+       +--------------------------+
           "char *" array

вам нужно изменить

printf("%s",*argv[i]);  

to

printf("%s",argv[i]);  

*argv[i] типа char. %s ожидает типа char *.


в вашем отредактированном вопросе вы исправили свою основную проблему. Теперь обратите внимание, что ваше приглашение выглядит как

./mygrep245YourName@ubuntu:~/test$

здесь ./mygrep245 ваш вывод после печати "5\n". Вы забыли распечатать каналы строк, таким образом, весь вывод и последующий вывод оболочки были объединены как есть. И последний аргумент 3 не был напечатан, потому что вы положили i<argc-1 вместо i<argc или i<=argc-1 в состояние петли.


char *argv[] указатель на указатель на char поскольку массивы в аргументах функции автоматически преобразуются в указатель, указывающий на элементы массива.

вы сослались неопределенное поведение путем передачи данных, имеющих неправильный тип в printf(): %s ждет char*, но ты прошел char (преобразован в int для Аргументов с переменным числом).

удалить лишние * o разыменование указателя.

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%d\n",argc);
    for(i=0;i<argc-1;i++)
    {
        printf("%s",argv[i]);
    }
    return 0;
}

также вы может хотеть i<argc вместо i<argc-1. Почему бы не напечатать последний аргумент?


вы можете передать документ:

Как вы можете видеть, main теперь имеет аргументы. Имя переменной argc обозначает "количество аргументов"; argc содержит количество аргументов перешел в программу. Имя переменной argv означает "вектор аргументов". Вектор-это одномерный массив, а argv-это одномерный массив строк. Каждая строка является одним из аргументов это было передано программе.

Если вы нужно распечатать его просто удалите * и попробуйте это:

#include<stdio.h>
int main(int argc, char *argv[])
{
    int i;
    printf("%d\n",argc);
    for(i=0;i<argc-1;i++)
    {
        printf("%s",argv[i]);   //remove * from here
    }
    return 0;
}

о

является ли argv массивом символов? или это массив указателей, указывающих на персонажей?

argv - массив c-строк (где каждая c-строка является указателем на символы). Рассмотрим следующую командную строку:

$ your-executable arg1 "arg2 with space"

это приведет к массиву строк со следующим содержимым (псевдо-код)

argv[0] EQUALS "your-executable"
argv[1] EQUALS "arg1"
argv[2] EQUALS "arg2 with space"

как уже упоминалось, удалите * from printf("%s", *argv[i]); и исправить состояние цикла, если вы хотите распечатать все аргументы