Как печатать аргументы 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?
В выше рисунок, я хочу, чтобы цифры 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]);
и исправить состояние цикла, если вы хотите распечатать все аргументы