Bonjour à tous,
voila j'ai besoin de concatené un certain nombre de char * j'ai vu strcat mais il y a quelque souci enfin si quelqu'un a de l'info la dessus je suis preneur![]()
jeremy
Bonjour à tous,
voila j'ai besoin de concatené un certain nombre de char * j'ai vu strcat mais il y a quelque souci enfin si quelqu'un a de l'info la dessus je suis preneur![]()
jeremy
Il n'y a aucun souci avec strcat, il suffit de savoir, comme toujours en C, ce que l'on fait : pour strcat il faut que le tableau de caractères recevant soit assez long pour pouvoir contenir l'ancienne chaîne plus la nouvelle chaîne concaténée.
Salut,
A quel style de soucis penses-tu concernant l'utilisation de strcat. Il faut juste faire attention à ce que la chaîne cible ait l'espace suffisant pour contenir les 2 chaînes concaténées et pour contenir le caractère '\0' en fin de chaîne.
Un petit exemple:
Le seul soucis et que le tableau de caractère cible doit contenir un minimum de 13 cases pour accueillir "Hello world!"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { char cible[20] = "Hello"; strcat(cible, " world!"); puts(cible); /* affiche "Hello world!"*/ return EXIT_SUCCESS; }
Meilleures salutations
Thierry
si tu as strncat... ça regle le probleme de taille de ton tableau ...
sinon tu peux recoder strncat !
Envoyé par man strncat
Quels sont tes soucis ? Si tu nous le dit pas on peut pas deviner ... enfin moi j'ai oublié de regarder au fond de ma tasse de théEnvoyé par jerem2000
![]()
Si c'est un problème de taille pour l'adresse cible, moi ce que je conseil, c'est d'allouer un espace pour la chaine cible de taille equivalente à toutes les chaînes à concaténer ensembles + 1 pour le zéro de fin.
Si tu ne connais pas le nombre de chaînes en avance, vive realloc (au lieu de malloc) !
Enfin voilà, dit nous en un peu plus et montre nous ton code !
oui voila le problem la taille et complètement variable
Bin montre ton code ... ca va pas se faire tout seul non plus.Envoyé par jerem2000
ok je te fait un exemple qui va reprendre juste ce dont j'ai besoin
voila et ca ca me pose problème! car ce sont des char*
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int main(int argc, char *argv[]) { //initialisation des variables char * end, user, pass; char * dest=""; //récupération des paramètres user=strtol(argv[1], &end, 0); pass=strtol(argv[2], &end, 0); //je concatène les chaines user, et pass strcat(dest,user); strcat(dest,pass); }
Il y a un problème, là: user et pass ne sont pas des chaînes, mais des char (un type entier, donc) qui reçoivent la valeur de retour de strtol() (de type long, un type entier également) qui ne sont pas directement concaténables à des chaînes...
La seule fonction standard disponible partout pour cela, c'est sprintf(). Attention, il faut être sûr de donner un buffer assez grand. Généralement, considérer 20 caractères max pour un entier est une taille raisonnable...
salut
Code : Sélectionner tout - Visualiser dans une fenêtre à part long int strtol (const char *nptr, char **endptr, int base);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *dest = ""; // euh... c'est quoi le but là ?
ué c vrai j'ai fait nimp la
voila jpense que c mieux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main(int argc, char *argv[]) { //initialisation des variables char * end, user, pass; char * dest=""; //récupération des paramètres user=argv[1]; pass=argv[2]; //je concatène les chaines user, et pass strcat(dest,user); strcat(dest,pass); }
Ouais bon je vais pas chercher plus loin que ca, si tu n'alloue pas l'espace pointé par dest tu risques jamais de y arriver ! Tu dois allouer de l'espace suivant ce que vont prendre comme place les autres chaînes.
Bon voilà pour le code remanié. Maintenant passons à un truc qui m'a grandement choqué ...
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 #include <stdlib.h> #include <stdio.h> #include <string.h> int main (int argc, char ** argv) { char * dest = NULL; /* Test des arguments. */ if (argc > 1) { /* Allocation d'un espace pour la chaîne */ dest = malloc (strlen (argv[1]) + strlen (argv[2]) + 2); if (dest != NULL) { /* je concatène les chaines user, et pass */ strcpy (dest, argv[1]); strcat (dest, ";"); strcat (dest, argv[1]); printf ("Nom et pass : %s\n", dest); /* Liberation de la memoire allouee. */ free (dest); dest = NULL; } else { fprintf (stderr, "Erreur pendant l'allocation de \"dest\" !\n"); exit (EXIT_FAILURE); } } else { fprintf (stderr, "Arguments manquants !\n"); } return EXIT_SUCCESS; }
Tu crois qu'avec strtol tu vas récupérer des arguments, du moins correctement ? Tu as lu ce que fait cette fonction ? Lit bien: strtol elle convertie une chaîne en entier long![]()
Toi tu veux une chaîne et rien d'autre alors je vois franchement pas ce que tu as essayé de faire là.
Juste un petit commentaire de fin sur ce que j'ai fait pour la concaténation. J'ai commencé par un strcpy car en fait, une fois la memoire allouée, elle n'est pas initialisée, elle contient donc des données indéfinies, donc pour éviter les ennuis du genre, des caractères inatendus, bin il faut correctement remplir le début soit par strcpy.
Une autre solution pour éviter ce problème serait de faire un memset sur l'espace fraîchement alloué puis là tu peux commencer directement par un strcat !
Voilà, si tu as des questions hésite pas![]()
Personnellement, j'ai abandonne strcat, pour concatener j'utilise "sprintf".
Essaye, tu vas voir, c'est une fonction qui gere presque l'infini...
De plus tu peux concatener plusieurs chaines de caracteres en l'appelant qu'une seule fois.
Oui c'est une solution parmis d'autresEnvoyé par toxycyty
![]()
nan strtol était une erreur de ma part! où je voulait recupérer la valeur entiere d'un argument j'ai copier sans regarder désolé
hmmm il y a un petit probleme la dans ton code dit moi si jme trompe mais malloc renvoi un void*!
Code : Sélectionner tout - Visualiser dans une fenêtre à part void *malloc(size_t size);
ok j'ai trouvé une alternative qui reprenait ton idée,
j'ai compté la taille necessaire de mon chaine en comptant le nombre de caractères des mes arguments et j'ai fait un char monChar[nbDeCar]
Et alors ?Envoyé par jerem2000
et alors tu declare dest en char* juste au dessus le compilo va pas trop aimé et c tout à fait normal
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