Аргументы к главному в C

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

6 ответов

Подпись main является:

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

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

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

./program hello world

Затем:

  • argc будет 3.
  • argv [0] будет "./program".
  • argv [1] будет "привет".
  • argv [2] будет "world".

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

*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

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

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], а не argv[1]), и в основном вы должны игнорировать первый аргумент, если вам не нужна ссылка или что-то еще

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

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

Хорошим справочником является руководство по GNU getopt

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

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

#include <stdio.h>

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

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 

Это вывод:

anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man
The follow arguments were passed to main(): hey man
anthony@anthony:~\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. Если бы я запустил эту программу выше, она напечатала бы путь / каталог программы. Пример: ~/Documents/C/CLA.c его нужно запустить из терминала и скомпилировать с помощью командной строки. gcc -o CLA main.c и вы должны находиться в каталоге файла.

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

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

#include <stdio.h>

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<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

И вывод похож на:

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
Другие вопросы по тегам