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 :

ecrire dans argv


Sujet :

C

  1. #1
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut ecrire dans argv
    Bonsoir,

    Comment peut on ecrire dans argv[1] ? parce que j'ai une erreur avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char tampon[100];
     
    if(argc != 2)
       {
       printf("Saisissez le fichier a charge: ");
       fgets(tampon,sizeof(tampon),stdin);
       strcpy(argv[1],tampon);
       }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: ecrire dans argv
    Citation Envoyé par semaj_james
    Comment peut on ecrire dans argv[1] ? parce que j'ai une erreur avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char tampon[100];
    if(argc != 2)
       {
       printf("Saisissez le fichier a charge: ");
       fgets(tampon,sizeof(tampon),stdin);
       strcpy(argv[1],tampon);
       }
    Je ne conseille pas cette pratique. Je ne suis même pas sûr que la mémoire pointée par *argv soit modifiable. Ca doit dépendre de l'implémentation. Personellement, je ne le ferais pas.

    Maintenant, si quelqu'un veut éplucher la norme, il est le bienvenu. Pour ma part, je file pub faire un peu de musique...

    A+
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut Re: ecrire dans argv
    Citation Envoyé par Emmanuel Delahaye
    Maintenant, si quelqu'un veut éplucher la norme, il est le bienvenu. Pour ma part, je file pub faire un peu de musique...

    A+
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut Re: ecrire dans argv
    Citation Envoyé par Emmanuel Delahaye
    Pour ma part, je file pub faire un peu de musique...
    A+

    D'ailleurs, si ce n'est pas indiscret, je me demandais de quel instrument tu jouais ? Cornemuse, cistre, bouzouki, ou autre ?
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J' ai commence par me dire que c'etait faisable... Allez, pourquoi pas s'amuser un peu et modifier argv...

    En y reflechissant voila les consequences:

    Si argc == 1, alors argv est un tableau dont la premiere dimension est egale a 1 et il y a un seul element argv[0] qui est le nom du programme.

    argv[1] n'existe pas, tu pourrais faire un segmentation fault juste en essayant de l'acceder...

    Deuxiemement, encore pire, supposons que argc>1, alors argv[1] existe mais tu l'ecrases... Imagines que argv[1] = "abc" mais que ton fichier c'est "bonjour.txt"... Encore une fois un joli depassement de memoire autoriser avec ecrasement des donnees qui suivent...

    La seule fois ou tu pourrais modifier un argv[i] serait de savoir qu'il est alloue et ne pas depasser la memoire deja allouee...

    Mais franchement: t'as pas mieux comme solution pour mettre ca en place?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char tampon[100];
    if(argc==1)
      {
       printf("Saisissez le fichier a charge: ");
       fgets(tampon,sizeof(tampon),stdin);
      }
    else
      strcpy(tampon,argv[1]);
    //Maintenant j'utlilise tampon...

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Puis où est vraiment l'intérêt d'écrire dans argv, moi en tous cas j'en vois pas, ca ne sert qu'à transmettre des options en ligne de commande au programme appelé puis c'est tout !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: ecrire dans argv
    Citation Envoyé par Pouic
    Citation Envoyé par Emmanuel Delahaye
    Pour ma part, je file pub faire un peu de musique...
    A+

    D'ailleurs, si ce n'est pas indiscret, je me demandais de quel instrument tu jouais ? Cornemuse, cistre, bouzouki, ou autre ?
    Bouzouki, banjo, mandoline, tin-whistle, piano, bodhran...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut Re: ecrire dans argv
    Citation Envoyé par Emmanuel Delahaye
    Bouzouki, banjo, mandoline, tin-whistle, piano, bodhran...
    Je ne connaissais ni le tin-whistle, ni le bodhran... J'aurais appris des choses aujourd'hui
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: ecrire dans argv
    Citation Envoyé par Pouic
    Citation Envoyé par Emmanuel Delahaye
    Bouzouki, banjo, mandoline, tin-whistle, piano, bodhran...
    Je ne connaissais ni le tin-whistle, ni le bodhran... J'aurais appris des choses aujourd'hui
    <Hors-sujet grave :>
    http://www.association-irlandaise.org/home.php
    </>
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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 Re: ecrire dans argv
    Désolé de revenir au sujet principal, mais il est tout à fait possible de modifier argc et argv[].

    Citation Envoyé par Emmanuel Delahaye
    Maintenant, si quelqu'un veut éplucher la
    norme, il est le bienvenu.
    Section 5.1.2.2.1

    The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
    Maintenant, devoir utiliser cette fonctionnalité est sans doute symptomatique d'une mauvaise conception... C'est à voir au cas par cas. Pour l'utilisation de semaj_james, c'est clairement une mauvaise solution...

  11. #11
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    je vous remercie

  12. #12
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut Re: ecrire dans argv
    Bonjour

    Citation Envoyé par DaZumba
    Maintenant, devoir utiliser cette fonctionnalité est sans doute symptomatique d'une mauvaise conception...
    Ca depends... C'est typique lorsque l'on utilise des fonctions telles getopts sous unixoides :
    Citation Envoyé par man 3 getopt
    NAME
    getopt -- get option character from command line argument list

    LIBRARY
    Standard C Library (libc, -lc)

    [...]
    EXAMPLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
         #include <unistd.h>
         int bflag, ch, fd;
     
         bflag = 0;
         while ((ch = getopt(argc, argv, "bf:")) != -1) {
    [...] 
        }
         argc -= optind;
         argv += optind;

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  13. #13
    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 Re: ecrire dans argv
    Citation Envoyé par Smortex
    Ca depends... C'est typique lorsque l'on utilise des fonctions telles getopts sous unixoides :
    Ben, getopt() analyse argc et argv, n'est-ce pas? Ils ne sont pas modifiés par la fonction (ils ne peuvent pas l'être, puisqu'on ne passe pas leur adresse).

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    argv est un tableau de chaînes non-constantes, donc getopt peut modifier les pointeurs du tableau (leur faire pointer au milieu des chaînes, par exemple) Ou les chaînes elles-mêmes (insérer un carac.nul avant la fin, par exemple).

    N'ayant pas utilisé getopt(), j'ignore si cette fonction fait l'une de ces choses, mais si c'est le cas, il y a des chances que ce soit la première...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut Re: ecrire dans argv
    Citation Envoyé par DaZumba
    Citation Envoyé par Smortex
    Ca depends... C'est typique lorsque l'on utilise des fonctions telles getopts sous unixoides :
    Ben, getopt() analyse argc et argv, n'est-ce pas? Ils ne sont pas modifiés par la fonction (ils ne peuvent pas l'être, puisqu'on ne passe pas leur adresse).
    Getopt ne les modifie pas, c'est a toi de le faire apres :
    Citation Envoyé par Smortex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         argc -= optind;
         argv += optind;
    Une fois que tu as finit de parser les "-alx" il te reste d'eventuelles informations que tu va traiter ... Exemple concret, la commande unix cp : getopts permet de configurer tous les paramètres de la copie, puis apres avoir modifié argc et argv, tu te retrouve à lire argv[1] = source, argv[2] = destination (dans le cas d'une seule source)

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

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

Discussions similaires

  1. Ecrire dans un DIV.
    Par cocula dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/02/2005, 15h01
  2. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  3. [VBS] Ecrire dans les Eventlog avec VBS
    Par Hakkou dans le forum VBScript
    Réponses: 1
    Dernier message: 04/10/2004, 14h50
  4. Réponses: 2
    Dernier message: 08/04/2004, 11h11
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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