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 :

pb concaténation d'une chaine avec un caractère


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut pb concaténation d'une chaine avec un caractère
    bonjour,

    dans l'un de mes projets en C , j'ai besoin de créer de nouveaux mots ( chaine de caractères) en concaténant un mot ancien avec une lettre d'un alphabet ( tableau de caractère).

    pour cela j'ai stocké les lettres possibles pour la concaténation dans un tableau de caractères, et j'ai essayé de concaténer un mot ancien avec une case de ce tableau afin de créer un nouveau mot.
    et voilà comment j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char nouveau_mot[5];
    char mot[2];
    strcpy(nouveau_mot," ");
    strcpy(mot,"aa");
    char alphabet[4]={'a','c','t','g'};
    int i;
    for(i=0;i<4;i++){
         strcpy(nouveau_mot,mot);
         strcat(nouveau_mot,alphabet[i]);
    }
    Je n'ai pas d'erreur de compilation mais un joli warning qui me prévient que dans l'appel de strcat le second argument produit un pointeur à partir d'un integer sans cast. et par conséquent j'ai un "segmentation fault" à l'exécution

    comment est ce que je peux faire pour utiliser mon tableau alphabet et ainsi créer correctement mes mots ?

    Merci d'avance

  2. #2
    Membre éclairé 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
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par P'tite Nélodie
    [...]
    Je n'ai pas d'erreur de compilation mais un joli warning qui me prévient que dans l'appel de strcat le second argument produit un pointeur à partir d'un integer sans cast. et par conséquent j'ai un "segmentation fault" à l'exécution
    [...]
    Il faut lire le manuel de plus près....en effet strcat attend une chaine de caractère en 2eme argument, alors que toi tu y mets un caractère.
    Pour ce qui est du "segmentation fault", cela provient vraisemblablement de ces 2 lignes de codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [...]
    strcpy(mot,"aa");
    [...]
    strcat(nouveau_mot,alphabet[i]);
    [...]
    Je te donne un indice : une chaine de caractère se termine toujours par le caractère de fin de chaine '\0'. Donc c'est une histoire de dépassement...

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      strcat(nouveau_mot,alphabet[i]);
    strcat concatène deux chaînes de caractères (terminées comme d'habitude par '\0') mais ne peut ajouter un simple char comme alphabet[i] à une chaîne. Les deux arguments de strcat doivent être des pointeurs sur char. strcat considère le caractère alphabet[i] (un int) comme l'adresse d'une chaîne -> warning et plantage.
    Pour ajouter un caractère à la suite d'une chaîne, il faut remplacer le '\0' terminal par le caractère et ajouter un '\0' ensuite (et que le tableau de destination soit assez grand). par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i = strlen(nouveau_mot);
    nouveau_mot[i] = ...        /* le caractère à ajouter */
    nouveau_mot[i+1] = '\0' ;

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    je crois que j'ai trouvé une solution pour mon ptit pb de concaténation , mais elle ne me plait pas tellement

    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
     
    char nouveau_mot[5];
    char mot[2];
    strcpy(nouveau_mot," ");
    strcpy(mot,"aa\0");
    char alphabet[4]={'a','c','t','g'};
    char caractere[2];
    caractere[0]="";
    caractere[1]="\0";
    int i;
    for(i=0;i<4;i++){
         strcpy(nouveau_mot,mot);
         caractere[0]=alphabet[i];
         strcat(nouveau_mot,caractere);
    }
    Je n'ai plus d'erreurs ou de warning, mais je trouve que c'est pas très pratique de passer par une variable de "caractere"
    Est ce que cette solution vous semble correcte?

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    caractere[0]="";
    caractere[1]="\0";
    Non, il suffit de (avec des ' simples)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0;i<4;i++){
         strcpy(nouveau_mot,mot);
         caractere[0]=alphabet[i];
         strcat(nouveau_mot,caractere);
    }
    Tu réinitialises nouveau_mot à chaque fois ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Avec le deuxième post ,j'ai pu éliminer la variable "caractere" en faisant de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char nouveau_mot[5];
    char mot[2];
    strcpy(nouveau_mot,"\0");
    strcpy(mot,"aa\0");
    char alphabet[4]={'a','c','t','g'};
    int taille_m;
    int i;
    for(i=0;i<4;i++){
         strcpy(nouveau_mot,mot);
         taille_m=strlen(nouveau_mot);
         nouveau_mot[taille_m]=alphabet[i];
         nouveau_mot[taille_m+1]='\0';
    }
    en fait si je voulais utiliser strcat, c'est que j'avais en mémoire d'autres langages de programmation où la manipulation des chaines de caractères est plus facile qu'en C et j'ai intuitivement adpaté cela au C avec strcat

    merci pour ces conseils

    je pense que mon code est correcte maintenant , non?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    oki j'avais récticfié pour les " et '
    j'avoue que je confond un peu leur utilisation :
    - " c'est pour une chaine de caractère,
    - ', c'est pour UN caractère
    c'est bien ça ?

    Et oui je réinitialise bien mon nouveau_mot à chaque fois afin de créer plusieurs mots selon la lettre ajoutée.

    Peut etre que l'initialisation n'est pas au bon endroit c'est possible car le code que je poste sur le forum n'est qu'un extrait de mon véritable code que j'adapte de manière générale pour faciliter la compréhension ( simplification, changement du nom de variable, ...).

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Tu dit que mot a une taille de deux octets (ligne 2). Et tu copies 3 ou 4 octets dedans (ligne 3). Il y a donc un dépassement mémoire. Ceci peut avoir de graves conséquences ou n'en avoir pas du tout, ça dépend de ton compilateur.
    Dans tous les cas, il faut corriger ça pour avoir un code valide :
    Sinon la solution de passer par une chaine intermédiaire pour pouvoir utiliser strcat n'est pas stupide. Mais peut être que le plus simple c'est de se passer de strcat...

    Pirouli

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Remarques :
    plus traditionnellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(nouveau_mot,"\0");
    strcpy(mot,"aa\0");
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(nouveau_mot,"");
    strcpy(mot,"aa");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      taille_m=strlen(nouveau_mot);
    a toujours la même valeur et doit donc sortie de la boucle for :

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    merci pour vos remarques et précieux conseils

Discussions similaires

  1. [SQL-Server] Concaténation d'une chaine de caractère avec un nom de table SQL
    Par Balthazar117 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/03/2011, 14h42
  2. Concaténer une chaine avec des antislashs
    Par Delack dans le forum Langage
    Réponses: 2
    Dernier message: 27/02/2010, 14h35
  3. Concaténation d'une chaine de caractères avec virgules
    Par s-kiss dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 12/09/2008, 23h26
  4. Réponses: 2
    Dernier message: 19/11/2007, 16h53
  5. Concaténation d'une chaine avec un champ
    Par arjo54 dans le forum Access
    Réponses: 0
    Dernier message: 27/07/2007, 13h34

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