web-dev-qa-db-fra.com

Comment lire des nombres comme arguments de commande?

Comment faire pour que le programme lise deux entiers avant de lancer le programme? Je veux que la sortie ressemble à ceci, avec x et y étant des variables tapées (j'utilise Cygwin):

$ ./a x y

produit de x et y

somme de x et y

J'ai utilisé int main(int argc, char *argv[]). J'ai essayé d'assigner argv[2] à x et argv[3] à y, mais quand je compile le programme, il dit que l'affectation fait un entier à partir d'un pointeur sans transtypage. Qu'est-ce que cela signifie et comment y remédier?

17
Kaity

En supposant le langage C:

  • Les arguments de ligne de commande se trouvent dans le tableau argv - argv [1], argv [2] etc.
  • La conversion d'un argument de chaîne en un entier peut être effectuée avec la fonction atoi.
  • La sortie peut être effectuée avec la fonction printf.

[Essayer de vous apprendre à pêcher, plutôt que de fournir un poisson. Bonne chance!]

44
Paul Beckingham

En supposant que vous utilisez bash, vous pouvez utiliser $ 1, $ 2, etc. pour ces arguments. Si, cependant, vous utilisez C, votre code devrait ressembler à ceci:

#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!
 }

J'espère que cela t'aides.

22
Mike

Premièrement, si vous exécutez votre programme C en tant que

./a x y

alors a est argv [0], x est argv [1] et y est argv [2], car les tableaux C sont basés sur 0 (c'est-à-dire que le premier élément du tableau est indexé avec 0.

Sachez que argv est un tableau (ou je l'ai toujours considéré comme un vecteur ARGument, bien que vous puissiez le considérer comme un tableau de valeurs ARGument) de pointeurs de chaîne de caractères. Vous devez donc convertir les chaînes en entiers. Heureusement, C possède des fonctions de bibliothèque pour convertir ASCII en entier. Consultez la documentation stdlib.h.

Bonne chance!

5
PTBNL

Mon code ressemblerait à ceci.

#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

3
theBuzzyCoder
int arg1 = argv[1];

Ne fonctionnera pas car c'est un tableau de pointeurs qui contient toutes les adresses de argv[0]....argv[n] pour obtenir la valeur de argv[..] supposons argv[1] vous devez écrire:

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

Dans les arguments de ligne de commande, char * argv [] est de type chaîne. Nous devons le convertir en entiers. Nous le faisons par conversion de type, mais dans oop, nous le faisons par la fonction atoi (méthode), cela fonctionne comme le transtypage (signifie méthode de conversion d'un type de données en un autre)

0