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 :

comment ajouter un caractere a une chaine?


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut [RESOLU]comment ajouter un caractere a une chaine?
    comment fait on pour ajouter un caractere a une chaine?

  2. #2
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Ba strcat. Tu créer une chaine pour ta lettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char lettre[1]="a" ; // lettre a
    strcat(chaine,a); //copie
    Ou tu te créer ta fonction qui va agrandir ta chaine d'un octet pour insérer le nouveau char (on suppose que ta chaine a été alloué dynamqiuement dans le tas et non la pile):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* AjouterLettre(char** string, char lettre)
    {
       *string=(char*) realloc(string, strlen(string)+2); //1 pour '\0' et 1 pour la lettre
    string[strlen(string)+1]=lettre ;
    return string ;
    }
    J'ai pas testé, il y a surement des erreurs.

    Nas'

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    desolé .... mais je suis incapable de corriger tes erreurs car j'ai pas l'habitude e faire des fonctions dans mes programmes car je suis un debutant...

    voila les erreurs :

    10 bouton.cpp passing `char **' as argument 1 of `strlen(const char *)'

    11 bouton.cpp passing `char **' as argument 1 of `strlen(const char *)'

    12 bouton.cpp return to `char *' from `char **'

  4. #4
    vic
    vic est déconnecté
    Membre confirmé

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

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Je ne vais pas corriger la fonction de NaskY car il y en a déjà 50 toutes faites pretes à être utilisées, je pointe juste les erreurs :

    Le paramètre string devrait être char*
    Il fait la supposition que le realloc initialise les octets ajoutés à 0 ce qui n'est pas (toujours) le cas.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char * chaine1 = "Hello ";
    char * chaine2 = "World";
    char * chaine3 = (char *)calloc(32,sizeof(char));
    strcat(chaine3,chaine1);
    strcat(chaine3,chaine2);
    //chaine3 == "Hello World"

  6. #6
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par vic
    Le paramètre string devrait être char*
    Il fait la supposition que le realloc initialise les octets ajoutés à 0 ce qui n'est pas (toujours) le cas.
    realloc pouvant, si la place memoire disponible le necessite, changer l'adresse de string, il faut passer un char ** en parametre pour que la modification d'adresse soit repercuter dans la fonction appelante.
    Par contre lors de l'uitlisation de string, il faut penser a l'indirection suplementaire, ie remplacer strlen(string) par strlen(*string), etc..

    Et aussi dans le premier exmple de Nasky, ce n'est pas char lettre[1]="a" mais char lettre[2]="a", il y a en effet deux caracteres : le a et le \0 de fin de chaine.

  7. #7
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 241
    Points
    8 241
    Par défaut
    il faut inclure string.h pour strlen

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 140
    Points : 76
    Points
    76
    Par défaut
    merci d'avoir donné un exemple nabo mais le probleme c que ce que tu as ecrit n'est pas la solution de mon probleme

    je m'explique :
    moi je vourais faire un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char chaine[8]="un truc", caractere;
     
    caractere=getchar();
     
    strcat(chaine,caractere);   //c la que ca devient  impossible .....
    mais ceci est impossible a realiser avec cette methode.....

    donc il m'en faut une qui fasse la meme chose mais qui marche

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <string>
    main()
    {
      char caractere;
      char chaine[]="un truc";
      printf("Chaine originale:%s\n",chaine);
      printf("Entrez un caractere:");
      caractere=getchar(); 
     
      strncat(chaine,&caractere,1);  
      printf("Chaine finale:%s\n",chaine);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    E:\home\test>gcc test.C -ansi
     
    E:\home\test>a.exe
    Chaine originale:un truc
    Entrez un caractere:e
    Chaine finale:un truce
     
    E:\home\test>
    [edit]Suite a une remarque , ce code n'est pas juste puisqu'il faut reallouer l'espace nécessaire.. Mon post suivant par contre tient compte des remarques[/edit]
    A bientot

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 55
    Points : 25
    Points
    25
    Par défaut
    Avec ton strcat, tu dois allouer toi meme la place manquante ....

    tu peux faire un truc dans le genre (j'ai pas de compilateur sous la main ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *string1[]
    string1 = malloc(strlen(tachaine)+1)
    string1 = strcpy(tachaine)
     
    //ta saisie
     
    string1 = realloc(strlen(tachaine)+strlen(tasaisie)+1)
    string1 = strcat(string1,string2)
    Enfin, je crois que c'est ca ... ca fait un petit moment que je n'ai pas fait de C.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    main()
    {
      char caractere;
      char *chaine="Bonjour";
      char *resultat=(char*) malloc(strlen(chaine)+1 *sizeof(char));
      printf("Chaine originale: %s\n",chaine);
      printf("Entrez un caractere:");
      caractere=getchar();
      strncat(resultat,chaine,strlen(chaine));
      strncat(resultat,&caractere,1);
      printf("Chaine finale: %s\n",resultat);
      free(chaine);
      free(resultat);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    E:\home\test>gcc test.C -ansi
     
    E:\home\test>a.exe
    Chaine originale: Bonjour
    Entrez un caractere:d
    Chaine finale: Bonjourd
     
    E:\home\test>
    A bientot

  12. #12
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il y a quelques problemes dans ton code Korta :

    * le premier strncat rajoute chaine a partir du premier \0 rencontre dans resultat or resultat n'est pas initialise, il faut donc soit initialise resultat, soit utilise calloc a la place de malloc (calloc initialise la zone alloue a 0)
    * dans le malloc tu alloue la taille pour les caracteres de la chaines initiales et pour le caractere que tu vas rajoute mais pas pour le \0 (strlen compte le nombre de caracteres de la chaine sans \0 donc strlen(chaine) va renvoyer 7). De plus la multiplication etant prioritaire sur l'addition ce n'est pas strlen(chaine)+1 *sizeof(char) mais (strlen(chaine)+1) *sizeof(char) (ce n'est pas tres grave pour des char, mais ca peut devenir problematique pour d'autre type)

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Suite aux remarques judicieuses que vous avez faites voici le code final:
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    main()
    {
      char caractere;
      char *chaine="Bonjour";
      char *resultat=(char*) malloc((strlen(chaine)+1) *sizeof(char));
      memset(resultat,0,(strlen(chaine)+1)*sizeof(char));
      printf("Chaine originale: %s\n",chaine);
      printf("Entrez un caractere:");
      caractere=getchar();
      strncat(resultat,chaine,strlen(chaine));
      strncat(resultat,&caractere,1);
      printf("Chaine finale: %s\n",resultat);
      free(chaine);
      free(resultat);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    E:\home\test>gcc test.c -ansi
     
    E:\home\test>a.exe
    Chaine originale: Bonjour
    Entrez un caractere:d
    Chaine finale: Bonjourd
     
    E:\home\test>
    A bientot

  14. #14
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il y a encore le probleme sur la taille d'allocation qui n'est pas suffisante pour le \0, ce qui donne plutot au final :

    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
    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    main() 
    { 
      char caractere; 
      char *chaine="Bonjour"; 
      // +1 pour le nouveau caractere et +1 pour le \0
      char *resultat=(char*) malloc((strlen(chaine)+1+1) *sizeof(char)); 
      memset(resultat,0,(strlen(chaine)+1)*sizeof(char)); 
      printf("Chaine originale: %s\n",chaine); 
      printf("Entrez un caractere:"); 
      caractere=getchar(); 
      strncat(resultat,chaine,strlen(chaine)); 
      strncat(resultat,&caractere,1); 
      printf("Chaine finale: %s\n",resultat); 
      free(chaine); 
      free(resultat); 
    }

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Il y a encore le probleme sur la taille d'allocation qui n'est pas suffisante pour le \0, ce qui donne plutot au final :

    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
    #include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    main() 
    { 
      char caractere; 
      char *chaine="Bonjour"; 
      // +1 pour le nouveau caractere et +1 pour le \0
      char *resultat=(char*) malloc((strlen(chaine)+1+1) *sizeof(char)); 
      memset(resultat,0,(strlen(chaine)+1+1)*sizeof(char)); 
      printf("Chaine originale: %s\n",chaine); 
      printf("Entrez un caractere:"); 
      caractere=getchar(); 
      strncat(resultat,chaine,strlen(chaine)); 
      strncat(resultat,&caractere,1); 
      printf("Chaine finale: %s\n",resultat); 
      free(chaine); 
      free(resultat); 
    }

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

Discussions similaires

  1. Comment suprimer des caractere dans une chaine.
    Par daduck dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/08/2008, 10h35
  2. comment modifie un caractere dans une chaine de caractere
    Par lenetfm dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 19/03/2008, 21h35
  3. Réponses: 13
    Dernier message: 03/10/2007, 11h25
  4. Réponses: 2
    Dernier message: 12/01/2006, 08h34
  5. Réponses: 6
    Dernier message: 17/10/2005, 14h38

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