Concaténer 2 chaînes de caractères

cs_tweeder Messages postés 172 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 19 juin 2009 - 9 mars 2006 à 20:35
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 10 mars 2006 à 01:58
J'ai une première chaîne : string_1[200] qui a une taille bien définie, puis j'ai char* string_2. Est-ce qu'il y a moyen de concaténer ces 2 chaînes en C ? J'ai essayé avec strcat, mais il n'aime pas mon string_2 car sa taille n'est pas définie.

Merci de votre aide,

Jonathan

20 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mars 2006 à 20:41
En effet, strcat n'aime pas les variable char *. Il ne prend que les tableau. Il n'y pas moyen de concatener des char * avec strcat. Essais sprintf comme ceci:


sprintf("%s%s", string_1, string_2);


Je n'est jamais essaillé ça alors je ne peut pas te dire si ça marchera.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mars 2006 à 20:43
Et si ça marche toujours pas bien met ton string_2 en tableau et utilise strcat. C'est pas si dramatique que ça car c'est la même chose qu'un char * mais avec une limite prédéfinie.
0
cs_tweeder Messages postés 172 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 19 juin 2009
9 mars 2006 à 20:46
Le problème c'est que je vais avoir des trucs louches dans mon tableau si je ne prends pas toute l'espace. Le sprintf ne semble pas fonctionner, merci pareil pour l'aide.
Faudrait p-e que j'utilise des tableaux dynamiques pour m'assurer d'avoir toutes l'informations que je désire dans mes tableaux. Je ne veux pas me déclarer un tableau de 20 quadn je vais p-e utiliser seulement 4 caractères.

Jonathan
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 mars 2006 à 22:25
Quoi, strcat ne prens pas des chaines de caracteres?
Alors la, j'en serais bien surpris!

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_tweeder Messages postés 172 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 19 juin 2009
9 mars 2006 à 22:29
Je m'en suis sorti avec memcpy, merci pour ton aide

Jonathan
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mars 2006 à 22:41
De rien. Petit message pour julienbj : en effet, strcat ne fonctionne pas avec char * mais seulement avec des tableaux.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 mars 2006 à 22:43
Si tu fais des strcat avec des char *, il va arriver plein d'erreure
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 mars 2006 à 23:02
Je suis absolument pas d'accord.
strcat va concatener a ta premiere chaine la chaine que tu lui donnes en la lisant jusqu'au caractere nul.
Je vais nommer str1 la chaine à laquelle on veut concatener str2.

Le probleme arrive seulement si l'espace réservé à str1 (que ce soit un tableau de caractères ou un char *) est trop faible pour contenir la longeur des str1 + la longueur de str2 + 1 (pour le \0).
Donc si probleme, uniquement souci d'allocation avec des char*. Heureusement que ca fonctionne d'ailleurs avec des char*, sinon on n'utiliserai jamais cette fonction.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 mars 2006 à 23:08
De toute facon, il n'y a qu'a regarder le prototype de stcat:
char *strcat( char *strDestination, const char *strSource );
Ou tu vois que les char* sont interdits, il n'y a que ca.
De toute facon, si tu fais char buffer[255].
buffer est considéré comme un char*. Ton compilo sait que seulement 255 octets lui sont alloués et te donnera au moins un warning si tu dépasse, mais ton pross lui n'en sait rien quand tu l'executes. buffer reste un pointeur de type char pour lequel on a alloué 255 octets de mémoire.

Faire char buffer[255] est la meme chose que char *buffer; buffer=malloc(255*sizeof(char));
Enfin, buffer représentera la meme chose. Apres faudrait voir comment le compilo gere le buffer[255]. Ne sachant pas je n'avancerait pas d'hypothese, mais ce pourrait etre intéressant de regarder.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 mars 2006 à 23:48
Aucun doute là-dessus, le nom d'un tableau est un pointeur vers le 1er elem.

char buffer[255];
dans une fonction, c'est sur la pile:
sub esp, 256
et voila on peut utiliser 256 octets au dessus en partant de esp.
256 au lieu de 255 cause que esp doit rester aligner sur 4 en 32 bits

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 mars 2006 à 23:53
Ah oui, c'est fameuse histoire d'alignement ;)
Je pensais pas que ça marchait aussi avec ca.
Ca veut dire que si je fais char buffer[253] ou char buffer[256] au final j'aurais le meme espace mémoire réservé dans la pile?

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
9 mars 2006 à 23:54
Bon, je récris, j'ai honte de lire les fautes que j'ai pu mettre.
donc au lieu de c'est fameuse... qui est absolument ridicule, veuillez lire svp:
"ces fameuses histoires ..."

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 mars 2006 à 00:11
aaaa désolé. J'oubliais l'allocation de la mémoire. Bon d'accord, ça marche.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 mars 2006 à 00:15
certain que le pointeur de pile ESP doit toujours être aligné.
Le compilo transforme toujours quand il voit
type[nbr];
il look si nbr n'est pas multiple de 4 il l'arrondit au muli de 4 immédiatement supérieur.
Ceci n'est pas systématique, si tu en as plusieurs à la suite dans une struct par exemple, il regarde le total et arrondit le dernier pour que l'ensemble soit multi de 4.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 mars 2006 à 00:18
Vraiment désolé. C'est que moi je n'utilise presque jamais malloc. J'alloue la mémoire nécessaire au début du programme (c'est peut-être pas la meilleur façon mais au moin on est sûre d'avoir toute la mémoire qu'il faut). En me parlent de malloc tu vien de me faire réveiller. J'avais vraiment oublié ça. Merci julienjb.
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 mars 2006 à 00:23
Plutot que de demander ce qui est aligné, je crois qu'il va etre plus rapide de demander ce qui n'est pas aligné.
C'est pas forcément une notion super evidente au départ. C'est dur d'imaginer que quand on met un octet sur la pile, en réalité c'est 4 octets qui sont pris.
Donc je supoose que tout est aligné selon la meme regle.

Cependant, comment se fait-il que certains pilotes ne soient pas alignés alors?
Je pose la question ici, mais si tu pouvais repondre dans le sujet sur l'alignement:
http://www.cppfrance.com/infomsg/ALIGNEMENT-DONNEES-3_679069.aspx
Ca aurait certainement plus de sens et serait plus simple à suivre pour référence future ;)
Merci en tout cas pour ces compléments d'infos.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 mars 2006 à 00:37
Bon bien pour tweeder, ne pourais t-il pas allouer de la mémoire pour string_2 avec malloc(200*sizeof(char)) pour qu'il ai la même taille et ensuite utiliser strcat?
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 mars 2006 à 00:40
Il faut voir comment il gere

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 mars 2006 à 00:49
Bizarre, tout le reste de mon message a été coupé.
Donc je disais qu'il fallait voir comment il gérait string_2.
Ensuite, il faut aussi savoir quelle chaine il essaie de copier apres quelle chaine. (en gros l'orde des parametres de son strcat)

Si tu pouvais aussi donner les symmptomes du probleme, ça pourrait aider un peu.
Et ce n'est pas en faisant un malloc (200*sizeof(char)) qu'il s'en sortira.
Imaginons deux chaines: str1 -> "abcd" et str2 -> "efgh"
Pour pouvoir copier str2 à la suite de str1, il faut que j'ai alloué suffisament d'espace à str1 pour pouvoir acceuillir également str2.
donc il faut que str1 soit défini comme suit:
char str1[9];
ou
char *str1;
str1=malloc(9*sizeof(char));

On voit donc que la taille du malloc minimal dépend de la longeur des deux chaines.
Mais peut etre que 200 c'est suffisant, ca depend des chaines qu'il utilise.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
10 mars 2006 à 01:58
tt a fait daccord avec julienbj, ca depend de ce que tu veu faire de ta chaine. tu veu la copier a la suite de str1? tu veu en creer une nouvelle? ... Enfin moi ske jte conseille c quand meme l'allocation dynamique

char * resultat;
resultat = (char*) malloc(sizeof(char) * (strlen(str1) + strlne(str2) + 1)); // +1 pour le zero terminal
strcpy(resultat, str1);
strcat(resultat, str2);
0
Rejoignez-nous