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 :

problème de chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut problème de chaine de caractères
    salut tout le monde :

    SVP est ce qu'il y a quelqu'un qui peut m'aider ,d'abord comment je remet une chaîne de caratères a NULL . elle est désactivée cette ligne dans le source.


    //for(int r=0;r<20;r++) chaine=NULL;**********************


    et 2iément si vous pouvez me rectifier mon programme
    car j'ai essayé pas mal de fois, pas d'erreurs de compilation, mais erreur de segmentation pendant l' exécution, je ne comprends pas d'où viens ça.
    merci d'avance

    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
    53
    54
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    int main ()
    {//mettre les lien de "PATH" dans le tableau tlien
       char *path = getenv("PATH");
       char *p,*tampon;
       p = strtok_r(path,":",&tampon);
       char **tlien[10];int k=0;
       while (p != NULL)
       { 
          tlien[k]=&p;
          //printf("%s\n",*tlien[k]);
          k++;
          p = strtok_r(NULL,":",&tampon);
       } //lire la ligne de commande et mettre chaque commande dans le tableau tab;
       char comand[80],*buffer,*c,sep[]="\t;|\n";
       printf("my shell >>");
       scanf("%[^\n]",&comand);
       c = strtok_r(comand,sep,&buffer);
       char **tab[10];int i=0;
       while (c != NULL)
       {
          tab[i]=&c;
          //printf("%s\n",c);
          //printf("%s\n",*tab[i]);
          i++;
          c = strtok_r(NULL,sep,&buffer);
       }
       //vérification de l'existance des commandes tapées
       int j=0,s=0,acces=1;
       char chaine[20];
       while (j != i)
       {
          while ((s != k)&&(acces == 1))
          {
             strcat(chaine,*tlien[j]);
             strcat(chaine,"/");
             char *p,*buf,*dup;
             dup = strdup(*tab[s]);
             if (dup==NULL) dup = *tab[s];
             p = strtok_r(dup," ",&buf);
             strcat(chaine,p);
             printf("%s\n",chaine);
             if (access(chaine,F_OK)==0) acces= 0; //la commande existe
             //for(int r=0;r<20;r++) chaine=NULL; *************************
             }
          if (acces == 0) { j++; s=0;acces = 1;}
          else {printf("commande inexistante \n");break;}
       }
       return 0;
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int r=0;r<20;r++)
        chaine[r]='\0';
    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.

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Citation Envoyé par Médinoc Voir le message

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int r=0;r<20;r++)
        chaine[r]='\0';
    En effet, sinon la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *memset(   void *dest,   int c,   size_t count );
    marche relativement bien il me semble (en tout cas je n'ai jamais eu de problème avec).

  4. #4
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Est-ce qu'il ne suffit pas de faire :
    ?

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut
    re

    merci à vous ,moi j'ai utiliser la fontion : strcpy(chaine,""); je ne sais pas est ce que ça marche ou pas ,

    le pblme que j'ai c'est que pas d'erreurs de compilations,mais erreur de segmentation , et ça se provoque au niveau du premier appel de strcat je ne sais pas pquoi ?? si vous pouvez m'aider sachant bien que je travaille sous linux .

    et ce qu'il y'a une autre fonction qui peut me servir ,et qui m'evite ce genre de pblme .

    merci encore une fois

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par laracroft87 Voir le message
    merci à vous ,moi j'ai utiliser la fontion : strcpy(chaine,""); je ne sais pas est ce que ça marche ou pas ,
    oui ça marche, et c'est strictement équivalent à ce qu'a écrit crocodilex.

    Il faut cependant être conscient que ça n'initialise pas l'ensemble des caractères. Pour ça, c'est soit memset (le plus court) soit une boucle.

    • Déjà, outre le fait que déclarer les variables en plein milieu du code est illisible, sauf si c'est dans des blocs (entourés par des accolades), ce n'est autorisé que en C99, et c'est rigoureusement interdit avant.

    • Ensuite, main est une fonction qui prend soit 0 argument, auquel cas on la déclares int main(void), soit 2 arguments, auquel cas on la déclare int main(int argc, char **argv)


    Je n'ai regardé le reste qu'en diagonale, bien qu'il me semble qu'il y aie un certain nombre d'erreurs majeures (dont char **tlien[10] mais un effort de présentation serait souhaitable tout d'abord.

  7. #7
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Citation Envoyé par laracroft87 Voir le message
    re

    merci à vous ,moi j'ai utiliser la fontion : strcpy(chaine,""); je ne sais pas est ce que ça marche ou pas ,

    le pblme que j'ai c'est que pas d'erreurs de compilations,mais erreur de segmentation , et ça se provoque au niveau du premier appel de strcat je ne sais pas pquoi ?? si vous pouvez m'aider sachant bien que je travaille sous linux .

    et ce qu'il y'a une autre fonction qui peut me servir ,et qui m'evite ce genre de pblme .

    merci encore une fois
    Un erreur de segmentation viens du fait que tu dois surement dépasser la capacité de ton tableau.

    Déjà, outre le fait que déclarer les variables en plein milieu du code est illisible, sauf si c'est dans des blocs (entourés par des accolades), ce n'est autorisé que en C99, et c'est rigoureusement interdit avant.
    En effet, c'est pas bien beau tout ça :p

    De plus essaye de donner des "NOM" a tes variable on comprendrai mieux ce qu'elles doivent faire :p

    Aussi j'ajouterais que tu dois avoir la possibilité de "virer" quelques variables, j'imagine que t'en a une ou deux que tu n'utilise qu'une fois ?


    PS : Est-on sûr que le STRCPY soit vraiment plus rapide et compréhensible qu'un bon vieux chaine[0]='\0' ??

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par laracroft87 Voir le message
    le pblme que j'ai c'est que pas d'erreurs de compilations,mais erreur de segmentation , et ça se provoque au niveau du premier appel de strcat je ne sais pas pquoi ??
    chaine n'est pas initialisée, il y a donc peu de chance que strcat() trouve un '\0' d'où un probable débordement de buffer.

Discussions similaires

  1. Problème avec chaine de caractères
    Par Nicegame dans le forum C
    Réponses: 7
    Dernier message: 27/04/2007, 18h35
  2. problème de chaine de caractère
    Par franco82 dans le forum C++
    Réponses: 10
    Dernier message: 01/12/2006, 20h32
  3. Problème fonctions chaines de caractères.
    Par Hayron06 dans le forum C
    Réponses: 12
    Dernier message: 13/11/2006, 21h47
  4. [MySQL] problème de chaine de caractère
    Par Leinad dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/10/2006, 14h52
  5. [FLASH 8] Problème de chaine de caractère
    Par dom_dev dans le forum Flash
    Réponses: 7
    Dernier message: 02/03/2006, 17h42

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