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 :

argv[] valeur modifer.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut argv[] valeur modifer.
    Salut les C,
    Je débute en C et je suis en train d'affûter mes pointeurs mais je bute sur un problème dont je ne connais pas la source:
    Le programme prend un mot comme argument et vous invite a taper ce que vous désirez et vous donne en réponse si le mot est présent dans votre entrée et à quel index.

    Le problème est que cela fonctionne une fois voire deux suite a quoi j'ai détecter grâce a des printf() que la valeur de l'argument argv[1], donc le mot a rechercher, se retrouve modifier et je suppose que c'est a cause de mes fonctions mais je ne voit vraiment pas pourquoi sauf si c'est la faute des pointeurs dans mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mon_prog.exe test
    deteste
    pattern present at index: 2
    fatest
    test
    ^Z
    Le programme est plus un exercice avec les pointeurs de tableau (oups pardon) et argv.
    Dont voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <stdio.h>
    #include <string.h>
     
    #define MAXLINESIZE 5000
     
    int get_pos(char s[],char t[],int i) ; 
    int get_index(char s[],char t[],int i) ;
     
    main(int argc, char *argv[]) {
      int c =0 ;
      char res[MAXLINESIZE] ;
      char *to_cmp=argv[1] ; /* la valeur a comparer se déforme  */
      while (fgets(res,MAXLINESIZE,stdin) != NULL ) {
        c++ ;
        /*
         * printf("%s\n",res)
         * printf("%s\n",argv[1]) La valeur de argv[1] se déforme lexicographiquement */
     
        if (strstr(res, to_cmp)) {
          int i=0 ;
          int idx ;
          idx=get_pos(res,to_cmp,i) ;
     
          printf("pattern present at index: %d\n",idx) ;
        }
     
      }
     
    }
     
    int get_pos(char s[],char t[],int i) {
      int bool = 0 ;
      for( ; *s != *t ; i++,*s++) {
        ; /* sauter les lettres non inclus dans le motif */
      }
      bool = get_index(s,t,i) ;
      return i ; 
     
    }
     
    int get_index(char s[],char t[],int i) {
      int c;
      *s=s[i] ; /* pb ? le pointeur est initialiser a l'intérieur de la fonction */
      *t= t[i] ;  /* pb ? le pointeur est initialiser a l'intérieur de la fonction */
      for( c=0 ; *s == *t ; c++,*s++,*t++) {
        if ((strlen(t)) == c+1) {
          return c ;  /* vérification si le mot est bien entièrement correspondant */
        }
       }
     
    }
    Sûrement que la réponse a ma question est simplement que comme je me sert de pointeurs la valeurs de argv[1] est modifier mais j'aimerai une confirmation ou plutôt une précision.

    Merci pour vos réponses éclairés.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Luke spywoker Voir le message
    Sûrement que la réponse a ma question est simplement que comme je me sert de pointeurs la valeurs de argv[1] est modifiée
    Effectivement, "to_cmp" pointe sur la zone mémoire de "argv[1]", du coup quand la valeur pointée par "to_cmp" est modifiée, c'est "argv[1]" qui l'est.

    Si tu ne veux pas que "argv[1]" soit modifié, tu peux passer à "to_cmp" une copie de "argv[1]", avec par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *to_cmp=strdup(argv[1]) ;
    Enfin, c'est un exemple "strdup" ayant beaucoup d'ennemis, un malloc suivi d'un strcpy serait sûrement plus judicieux

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La chaine est modifiée ici (ligne 45) *t= t[i] ; /* pb ? le pointeur est initialiser a l'intérieur de la fonction */qui est équivalente à t[0]= t[i] ;.

    Maintenant, pour trouver la position, il suffit d'utiliser la valeur de retour de strstr().

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par diogene Voir le message
    Maintenant, pour trouver la position, il suffit d'utiliser la valeur de retour de strstr().
    Effectivement, après si il s'agit d'un exercice je peux comprendre qu'un simple appel de fonction ne satisfasse pas le professeur, ceci-dit, il y a encore beaucoup de choses à corriger dans le code :

    get_pos renvoie soit l'emplacement dans la chaine à tester de la première lettre de la chaine à trouver (quelle que soit les suivantes) soit la taille de la chaine à tester + 1 si elle n'est pas présente.

    get_index renvoie à peut près n'importe quoi (pas de "return" hors de ta condition) ce qui finalement n'est peut être pas si grave puisque son retour est stockée dans une variable qui n'est utilisée nulle part...

    (ne jamais hésiter à écrire un peu de pseudo code sur un bout de papier)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ne pas hésiter non plus à déclarer "const" les chaînes en paramètre si la fonction n'est pas censée les modifier.
    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.

Discussions similaires

  1. Modifer une valeur dans un panier sans la valider
    Par budiste dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2006, 09h53
  2. Réponses: 11
    Dernier message: 22/02/2006, 17h25
  3. [VB6]Modification de valeurs dans une MSflexgrid
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 14/02/2006, 08h48
  4. [C#] Datagrid et modification de valeur
    Par Kaïn dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/01/2006, 11h48
  5. [VB.NET] [XML] Modification d'une valeur
    Par kirk80 dans le forum Windows Forms
    Réponses: 9
    Dernier message: 09/09/2004, 16h15

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