Аргументы для основного в C

Я не знаю, что делать! У меня есть большое понимание основ C. Структуры, файл ввода-вывода, строки и т. Д. Все, кроме CLA. По какой-то причине я не могу понять концепцию. Любые предложения, помощь или советы. PS Я пользователь linux

Подпись main :

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

argc ссылается на количество переданных аргументов командной строки, которое включает в себя фактическое имя программы, вызванное пользователем. argv содержит фактические аргументы, начиная с индекса 1. Индекс 0 – это имя программы.

Итак, если вы запустили свою программу следующим образом:

 ./program hello world 

Затем:

  • argc будет 3.
  • argv [0] будет «./program».
  • argv [1] будет «привет».
  • argv [2] был бы «миром».

Для анализа аргументов командной строки в системах posix стандартом является использование семейства библиотечных процедур getopt() для обработки аргументов командной строки.

Хорошей ссылкой является руководство GNU getopt

Представьте это так

 *main() is also a function which is called by something else (like another FunctioN) *the arguments to it is decided by the FunctioN *the second argument is an array of strings *the first argument is a number representing the number of strings *do something with the strings 

Может быть, пример программы woluld поможет.

 int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; } в int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; } 

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

скомпилируйте его (как приветствуйте) запустите его с терминала с такими аргументами, как

 ./hello am i here 

затем попробуйте изменить его так, чтобы он пытался проверить, не изменились ли две строки друг друга или нет, тогда вам нужно будет проверить, является ли параметр argc ровно тремя, если что-либо еще напечатает ошибку

 if(argc!=3)/*3 because even the executables name string is on argc*/ { printf("unexpected number of arguments\n"); return -1; } 

затем проверьте, является ли argv [2] обратным аргументом argv [1] и напечатайте результат

 ./hello asdf fdsa 

должен выводить

 they are exact reverses of each other 

лучший пример – программа копирования файлов, попробуйте, это похоже на cp

cp file1 file2

cp – первый аргумент (argv [0] not argv [1]), и в основном вы должны игнорировать первый аргумент, если вам не нужно ссылаться или что-то

если вы сделали программу cp, которую вы поняли, основные аргументы действительно …

Сиамор, я все время вижу, что все используют командную строку для компиляции программ. Я использую терминал x11 из ide через code :: blocks, gnu gcc-компилятор в моем linux-окне. Я никогда не компилировал программу из командной строки. Итак, Siamore, если я хочу, чтобы имя программы было cp, инициализируйте argv [0] = «cp»; Cp является строковым литералом. И что-нибудь, идущее в stdout, идет по командной строке ??? Пример, который ты мне дал Сиамор, я понял! Несмотря на то, что строка, в которую вы ввели, несколько слов, это был только один аргумент. Потому что он заключен в двойные кавычки. Итак, arg [0], имя prog, на самом деле является вашим строковым литералом с новым символом строки? Поэтому я понимаю, почему вы используете ошибку (argc! = 3). Поскольку prog name = argv [0] и после этого есть еще 2 аргумента, и больше ошибка произошла. Какую еще причину я могу использовать? Я действительно думаю, что мое отсутствие понимания о том, как скомпилировать из командной строки или терминала, является моей причиной отсутствия понимания в этой области! Сиамор, ты помог мне понять, что Клаа намного лучше! Все еще не совсем понимаю, но я не забываю эту концепцию. Я собираюсь научиться компиляции с терминала, а затем перечитать то, что вы написали. Бьюсь об заклад, тогда я полностью пойму! С чуть большей помощью от вас LOL

<> Код, который я сам не написал, но из моей книги.

 #include  int main(int argc, char *argv[]) { int i; printf("The following arguments were passed to main(): "); for(i=1; i 

Это результат:

 [email protected]:~\Documents/C_Programming/CLA$ ./CLA hey man The follow arguments were passed to main(): hey man [email protected]:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing? The follow arguments were passed to main(): hi how are you doing? 

Итак, argv - это таблица строковых литералов, а argc - их число. Теперь argv [0] - это название программы. Поэтому, если я набираю ./CLA для запуска программы ./CLA - argv [0]. Вышеупомянутая программа устанавливает командную строку для принятия бесконечного количества аргументов. Я могу настроить их только на 3 или 4, если захочу. Как показано на одном или ваших примерах, Siamore ... if (argc! = 3) printf («Некоторая ошибка здесь»); Спасибо Сиамору, не мог бы сделать это без тебя! благодаря остальной части сообщения для их времени и усилий также!

PS в случае возникновения такой проблемы в будущем ... вы никогда не знаете, что проблема была в том, что я использовал IDE AKA Code :: Blocks. Если бы я запустил эту программу выше, она напечатала каталог path / program. Пример: ~ / Documents / C / CLA.c его нужно запустить из терминала и скомпилировать с помощью командной строки. gcc -o CLA main.c, и вы должны находиться в каталоге файла.

Главная такая же, как и любая другая функция, а argc и argv – как и любые другие аргументы функции, разница в том, что main вызывается из C Runtime и передает аргумент main, но C Runtime определяется в c-библиотеке, и вы не можете ее изменить , Так что если мы выполняем программу на оболочке или через некоторую среду IDE, нам нужен механизм для передачи аргумента главной функции, чтобы ваша основная функция могла вести себя по-разному в среде выполнения в зависимости от ваших параметров. Параметры argc, который дает количество аргументов и argv, который является указателем на массив указателей, который содержит значение как строки, таким образом вы можете передавать любое количество аргументов, не ограничивая его, это другой способ реализации var args.

Сделал небольшое изменение для кода @anthony, чтобы мы могли получить хорошо отформатированный вывод с номерами аргументов и значениями. Как-то проще читать на выходе, когда у вас несколько аргументов:

 #include  int main(int argc, char *argv[]) { printf("The following arguments were passed to main():\n"); printf("argnum \t value \n"); for (int i = 0; i 

Результат аналогичен:

 The following arguments were passed to main(): 0 D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe 1 -P 2 TestHostAttoshiba 3 _http._tcp 4 local 5 80 6 MyNewArgument 7 200.124.211.235 8 type=NewHost 9 test=yes 10 result=output 
Interesting Posts

Преобразование записей в последовательную форму данных для отправки по HTTP

GlobalConfiguration.Configure () не отображается после переноса Web API 2 и .NET 4.5.1

Outlook 2013 рассматривает источник сообщения RAW по электронной почте

Корреляция двух массивов в C #

Доступ к элементам управления пользовательским интерфейсом в Task.Run с помощью async / wait на WinForms

Чтение (восстановление) данных с сломанной дискеты на linux-системе

Наследование Java – переопределение переменных экземпляра

Замена текста в Apache POI XWPF

Сколько строковых объектов Java создано в коде String s = “abc” + “xyz” ;?

Iphone SDK отклоняет Modal ViewControllers на ipad, щелкнув за его пределами

Доступ к структуре свойства по имени

Восстановить миниатюры .psd в Windows 10, удалив ассоциацию файлов по умолчанию в реестре

Все браузеры невероятно медленны, кроме … оперы?

Почему мы должны включать ttf, eot, woff, svg, … в шрифт-face

Не удается удаленный доступ к компьютеру, потому что «удаленному компьютеру требуется сетевая аутентификация»

Давайте будем гением компьютера.