comment fait on pour ajouter un caractere a une chaine?
comment fait on pour ajouter un caractere a une chaine?
Ba strcat. Tu créer une chaine pour ta lettre :
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 char lettre[1]="a" ; // lettre a strcat(chaine,a); //copie
J'ai pas testé, il y a surement des erreurs.
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 ; }
Nas'
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 **'
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.
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"
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.Envoyé par vic
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.
il faut inclure string.h pour strlen
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 :
mais ceci est impossible a realiser avec cette methode.....
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 .....
donc il m'en faut une qui fasse la meme chose mais qui marche
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); }[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]
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>
A bientot
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 ...)
Enfin, je crois que c'est ca ... ca fait un petit moment que je n'ai pas fait de C.
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)
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); }A bientot
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>
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)
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); }A bientot
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>
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); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager