IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Passage des arguments par le shell


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut [RESOLU] Passage des arguments par le shell
    Bonjour à tous,

    je suis étudiant en IUP à Toulouse et on nous a filé un sujet qui me semblait simple mais je n'avais pas pris en compte le fait que le tableu de pointeurs char *argv[] (je sais c con...) pointait sur des char !!!

    Voici le sujet :

    Ecrire un programme qui affiche la somme des deux valeurs qui lui sont passées en paramètres.
    Et voici le code que j'ai pondu naïvement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	if (argc > 3)
    	{
    		int sum = (int *)*argv[1] + (int *)(* argv[2]);
    		printf(sum);
    	}
    }
    Existe-t-il une fonction de la biliothèque standard ou autre qui me permette de passer d'un char (équivalent à byte me semble-t-il ?)
    à un int ?

    Ah! J'oubliais de dire que j'ai cherché dans le K&R et "la référence du C ANSI/ISO" de Delannoy ainsi que sur google et je n'ai rien trouvé.
    Tous les articles manipulent uniquement des chaines de caratères passées en paramètre par le shell. => C'EST RAGEANT !!!
    Merci d'avance
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  2. #2
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    pour convertir un char* en int il faut utililiser la fonction atoi voir cette page :
    http://man.developpez.com/man3/atoi.3.php
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par hiko-seijuro
    pour convertir un char* en int il faut utililiser la fonction atoi voir cette page :
    http://man.developpez.com/man3/atoi.3.php
    Faut savoir vivre avec son temps :
    int atoi(const char* s);
    Equivalent to (int)strtol(s, (char**)NULL, 10) except that errno is not necessarily set on conversion error.

  4. #4
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Merci pour le coup de main.

    Cependant, après modification de mon code, je n'obtiens pas de sortie à l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
    	int sum;
    	if (argc > 3)
    	{
    		sum = atoi(argv[1]) + atoi(argv[2]);
    		printf("%d\n",sum);
    	}
    }
    Pourtant je ne trouve pas d'erreur... PARDON A TOUS POUR L'ERREUR IGNOBLE QUE J'AI FAITE DANS MON CODE #1 : le est un blasphème. Pardon K&R !!! lol
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Tu ne trouves pas l'erreur?! Compte le nombre d'arguments: le nom du programme et deux valeurs a additionner. Ca fait 3. Et ton test demande qu'il soit superieur a 3...

    De plus atoi() est depreciee. Il faut utiliser strtol(), qui permet un meilleur traitement d'erreur (echec si l'utilisateur entre 123q, 89.0, par exemple...).

  6. #6
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Je ne sais pas quoi dire à part merci. Je vous le jure, d'habitude ma nullité est inférieure mais à 11h pour moi c'est le petit matin.

    Vraiment merci.

    Autre petite question : pour une bonne documentation des fonctions que vous me présentez, auriez-vous des liens svp ?

    Merci encore
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    Citation Envoyé par panda31
    Autre petite question : pour une bonne documentation des fonctions que vous me présentez, auriez-vous des liens svp ?
    Le pense bête : C Standard Librairie

    Pour plus d'info, il existe des pages de manuel sous Linux accessible grâce à la commande :
    Si tu n'a pas Linux, a taper directement sous google et généralement le premier lien attérie directement sur la page : exemeple

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Si tu es sous Unix ou Linux, utilises les man pages (man atoi, man strtol). D'ailleurs, tu verras que tu oublies d'inclure stdlib.h. Si tu es sous Windows, tu peux utiliser google ou la MSDN.

    strtol() s'utilises comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    long value;
    char *p;
     
    value = strtol(argv[1], &p, 10);
    if(*p != '\0')
    {
        fprintf(stderr, "Could not convert %s to integer.\n", argv[1]);
        return EXIT_FAILURE;
    }
     
    /* de la meme facon pour argv[2] */
    (note: pour les nombres reels non entiers, il faut utiliser strtod().)

  9. #9
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    MERCI beaucoup, j'ai bien appris aujourd'hui grâce à vous.

    A bientôt.
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage des arguments par valeur
    Par mpereg dans le forum Général Python
    Réponses: 4
    Dernier message: 13/03/2007, 17h12
  2. probleme sur le passage d'argument par adresse
    Par ghostdog dans le forum C
    Réponses: 4
    Dernier message: 23/11/2005, 15h50
  3. [PHP-JS] Passage des parametres par JavaScript
    Par anutka dans le forum Langage
    Réponses: 7
    Dernier message: 20/10/2005, 11h02
  4. Réponses: 2
    Dernier message: 19/07/2005, 11h12
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo