Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Подпись main:

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

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

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

./program hello world

Тогда:

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

Ответ 2

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

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

Ответ 3

Siamore, я все время вижу, что все используют командную строку для компиляции программ. Я использую терминал 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 <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;
} 

Это вывод:

[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:: Блоки. Если бы я запустил эту программу выше, она напечатала каталог path/program. Пример: ~/Documents/C/CLA.c его нужно запустить из терминала и скомпилировать с помощью командной строки. gcc -o CLA main.c, и вы должны находиться в каталоге файла.

Ответ 4

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

*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 help.

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, которую вы понимаете, основные аргументы действительно...

Ответ 5

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

Ответ 6

Сделал небольшое изменение для кода @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