Как читать числа в качестве аргументов команды? - PullRequest
12 голосов
/ 07 февраля 2009

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

$ ./a x y

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

сумма х и у

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

Ответы [ 6 ]

38 голосов
/ 07 февраля 2009

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

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

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

21 голосов
/ 07 февраля 2009

Предполагая, что вы используете 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!
 }

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

4 голосов
/ 07 февраля 2009

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

. / А х у

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

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

Удачи!

1 голос
/ 30 октября 2017

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

#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);
}

enter image description here

0 голосов
/ 13 сентября 2017
int arg1 = argv[1];

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

int n=*argv[1]-'0'; // Direct atoi 
0 голосов
/ 11 мая 2016

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

...