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

Как може да стане така, че програмата да чете всеки две цели числа, въведени преди програмата да бъде стартирана? Искам изходът да изглежда така, като x и y са всички въведени променливи (използвам Cygwin):

$ ./a x y

произведение на x и y

сбор от 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
Използвам c език. Обхванахме само първите три глави от книгата, а тази глава е наполовина и за мен е пълна глупост. Учителят описа това, когато отсъствах, така че нямам представа!   -  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 int този случай argv[0] ще сочи към 'some'.

person Denise Ignatova    schedule 05.08.2021