Как читать числа в качестве аргументов команды?

Как сделать так, чтобы программа считывала любые два целых числа перед запуском программы? Я хочу, чтобы вывод выглядел так, где x и y — любые введенные переменные (я использую Cygwin):

$ ./a x y

произведение х и у

сумма х и у

Я использовал int main(int argc, char *argv[]). Я пытался присвоить argv[2] x и argv[3] y, но когда я компилирую программу, она говорит, что присваивание делает целое число из указателя без приведения. Что это значит и как это исправить?


person Kaity    schedule 07.02.2009    source источник
comment
Разве в вашем учебнике нет примеров использования аргументов команды?   -  person mmcdole    schedule 07.02.2009
comment
Я использую язык Си. Мы рассмотрели только первые три главы книги, а эта глава находится на полпути и для меня является полной тарабарщиной. Учитель рассказал об этом, когда меня не было, так что я ничего не знаю!   -  person Kaity    schedule 07.02.2009
comment
Зачем вы открыли 2 темы на одну и ту же тему? Пожалуйста, закройте один.   -  person qrdl    schedule 07.02.2009
comment
об обновлении: не могли бы вы опубликовать свой код. Если вы посмотрите мой пример ниже, он компилируется для меня в gcc без ошибок или предупреждений. Также, пожалуйста, сообщите нам, какой компилятор вы используете. Спасибо.   -  person Mike    schedule 07.02.2009


Ответы (7)


Предполагая язык C:

  • Аргументы командной строки находятся в массиве argv — argv[1], argv[2] и т. д.
  • Преобразование строкового аргумента в целое число можно выполнить с помощью функции atoi.
  • Вывод можно сделать с помощью функции printf.

[Попытка научить вас ловить рыбу, вместо того, чтобы дать рыбу. Удачи!]

person Paul Beckingham    schedule 07.02.2009
comment
Раньше я умел ловить рыбу, но забыл. Предпочел бы напоминание, чем покровительство. - person jwg; 09.07.2018

Предполагая, что вы используете bash, вы можете использовать $1, $2 и т. д. для этих аргументов. Однако, если вы используете C, ваш код должен выглядеть примерно так:

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[]) {
    if(argc<=1) {
        printf("You did not feed me arguments, I will die now :( ...");
        exit(1);
     }  //otherwise continue on our merry way....
     int arg1 = atoi(argv[1]);  //argv[0] is the program name
                                //atoi = ascii to int
     //Lets get a-crackin!
 }

Надеюсь это поможет.

person Mike    schedule 07.02.2009

Во-первых, если вы запустите свою программу C как

./a x y

тогда a — это argv[0], x — это argv[1], а y — это argv[2], так как массивы C основаны на 0 (т. е. первый элемент в массиве индексируется с 0.

Поймите, что argv — это массив (или я всегда думал о нем как о векторе ARGument, хотя вы можете думать о нем как о массиве значений ARGument) указателей на символьные строки. Итак, вам нужно преобразовать строки в целые числа. К счастью, в C есть библиотечные функции для преобразования ASCII в целое число. Посмотрите документацию stdlib.h.

Удачи!

person PTBNL    schedule 07.02.2009

Мой код будет выглядеть так.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    // argc is number of arguments given including a.out in command line
    // argv is a list of string containing command line arguments
    int total = 0;
    int i;
    char *value;
    for(i = 1; i < argc; i++)
    {
        // The integers given is read as (char *)
        value = argv[i];
        printf("Command line index: %d value: %s in ascii: %d\n", i, value, *value);

        // Convert ascii to integer.
        // atoi function is defined in stdlib.h
        total += atoi(value);
    }
    // .2f limits the decimals to two digits after '.'
    printf("Total of given integers is %d\n", total);
}

введите здесь описание изображения

person theBuzzyCoder    schedule 30.10.2017

int arg1 = argv[1];

Не будет работать, потому что это массив указателей, который содержит все адреса argv[0]....argv[n], чтобы получить значение argv[..] предположим, что argv[1] вам нужно написать:

int n=*argv[1]-'0'; // Direct atoi 
person Jaideep Jagyasi    schedule 13.09.2017

В аргументах командной строки char*argv[] является строковым типом. Нам нужно преобразовать его в целые числа. Мы делаем это путем приведения типов, но в oop мы делаем это с помощью функции (метода) atoi, она работает как приведение типов (означает метод преобразования одного типа данных в другой)

person Asma asghar janjua    schedule 11.05.2016
comment
char* argv[] — это указатель на char — здесь это массив char *, а не строковый тип. - person mattsap; 11.05.2016
comment
в C нет строковых типов, в основном строки представляют собой массивы char -массивы символов char[] - person Denise Ignatova; 05.08.2021

Простое использование atoi() преобразует ввод консоли типа char в int.

   int main(argc, char* argv[])
   {
      int first = atoi(argv[1]);
      printf("%i", first);
   }

Если вы спросите, почему argv[1] вместо argv[0], ответ будет таков: первый аргумент — это имя вашего исполняемого файла./some 2 в этом случае argv[0] будет указывать на «some».

person Denise Ignatova    schedule 05.08.2021