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 :

Probleme de strcpy et de char**


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut Probleme de strcpy et de char**
    Bonjour à tous,

    Je me trouve devant un problème de segmentation donc de mémoire...
    Je vous explique :

    Mon programme prend plusieurs arguments et je souhaiterais qu'une partie de ces arguments soient copiées dans un tableau de tableau de char (i.e char** tab).

    Seulement lorsque j'essai de strcpy l'argument qui est une string, dans mon tab, j'obtiens une erreur de segmentation.

    Voici le code pour plus de clarté :

    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
     
    int main(int argc, char* argv[]) 
        {
            int k,i,j,g =1; // EDIT j = 1 (oubli)
            char ** tab = malloc(argc*sizeof(char*));
            for(i=1;i<argc;i++){
    	       tab[i]=malloc(50*sizeof(char));
            }
            for (g=1;g<argc;g++) // on commence a 1 car argv[0] correspond au   nom de la fonction.
          { // on parcourt tous les arguments 
                    if (strcmp( "-a", argv[g])==0){ // idem
    	         // tant qu'on ne rencontre pas de signe '-' qui signifie une option , on continue (cas ou il y a plusieurs arguments
                           while(strncmp(argv[g+j],"-",1)){
    		              strcpy(tab[j-1],argv[g+j]); // ERREUR PROBABLE ICI
    		              j++;
    	      }
     
     
            printf("%s %s %s", tab[0],tab[1],tab[2]);
            return 0;
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    je ne vois pas "j" !!!

    Dans strcpy(tab[j-1],argv[g+j]) : tu copies le g+j ième élément de la ligne de commande.
    Ce que tu veux faire c'est copier le g ième élément à partir de la position j, ce n'est pas pareil.

    PS : il existe déjà une fonction (linux) pour gérer les lignes de commandes, ça s'appelle getopt (son code source est aussi dispo pour l'utiliser sous Windows).

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    En fait, ma commande sera comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./a.out -x (optionX) -a Jean Paul Bibi -y (optionY)
    et je souhaite que mon tableau char** tab enregistre Jean dans tab[0] , Paul dans tab[1]...etc

    Edit : Je pense vraiment que ces 2 lignes posent problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	while(strncmp(argv[g+j],"-",1) && (g+j < argc )) {
    		strcpy(tab[j-1],argv[i+j]); // ERREUR PROBABLE ICI
    		j++;
    	      }
    mais pourquoi ?!

    Edit 2 : j'ai rajouté dans le while, la condition (g +j < argc) pour pas que ca dépasse...

    Merci.

  4. #4
    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
    Comme te l'a dit mala92, j n'est pas initialisé et contient n'importe quoi !

    j'ai rajouté dans le while, la condition (g +j < argc) pour pas que ca dépasse...
    Encore faut-il le faire dans le bon ordre (qui est important pour les opérateurs && et ||)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((g+j < argc) && strncmp(argv[g+j],"-",1) )

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Quand vous dites pas initialisé, je n'ai pas le droit de déclarer et d initialiser plusieurs entiers à la suite ? ?

    Pour la condition (g+j < argc) , pourquoi dois-je la mettre avant la comparaison de strncmp ?

    Merci pour la réponse Diogène & Mala92 , mais si je peux comprendre en plus, j'aurais tout gagné...

    Ce que je vois : ma boucle for parcourt tous les arguments apres le ./a.out, puis si je rencontre un -a et tant qu'il n'y a pas de - (pour signifier une nouvelle option) et qu'on ne dépasse pas le nombre d'argument, je copie les arguments dans mon tableau...

    Merci d'avance.

  6. #6
    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
    -
    Quand vous dites pas initialisé, je n'ai pas le droit de déclarer et d initialiser plusieurs entiers à la suite ?
    Chacun doit être initialisé séparément .
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int i, j = 1, k, l = 1;
    i et k ne sont pas initialisés. j et l sont initialisés à 1

    -
    Pour la condition (g+j < argc) , pourquoi dois-je la mettre avant la comparaison de strncmp ?
    Parce que les opérandes de && et de || sont évaluées dans l'ordre et que si la décision peut être prise par l'évaluation de l'opérande de gauche, l'opérande de droite n'est pas évalué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (g+j < argc) && strncmp(argv[g+j],"-",1)
    Si g+j < argc alors on évalue strncmp(argv[g+j],"-",1)
    Si g+j >= argc alors on n'évalue pas strncmp(argv[g+j],"-",1) et du coup on ne plante pas pour dépassement du tableau argv[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     strncmp(argv[g+j],"-",1) && (g+j < argc)
    strncmp(argv[g+j],"-",1) est toujours évalué même si (g+j >= argc) et on peut planter.

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

Discussions similaires

  1. Problem entres System::string et char*
    Par Farow dans le forum C++/CLI
    Réponses: 9
    Dernier message: 05/01/2012, 20h13
  2. Probleme avec strcpy
    Par secksy dans le forum Débuter
    Réponses: 9
    Dernier message: 05/10/2008, 12h59
  3. problem de Structure et de char**
    Par PiXi-PiX dans le forum C
    Réponses: 2
    Dernier message: 07/02/2007, 08h47
  4. [TP] Problème avec les intervalles de char
    Par Petrucci dans le forum Turbo Pascal
    Réponses: 29
    Dernier message: 11/11/2006, 22h19
  5. Réponses: 2
    Dernier message: 24/03/2006, 10h46

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