[C] - Prob avec strcat() [résolu]

- Prob avec strcat() [résolu] [C] - C++ - Programmation

Marsh Posté le 02-10-2002 à 14:18:15    

Bonjour, voila a partir d'un fichier je veux reconstituer un mot caractere par caractere mais voila ce qu'il me dit quand j'essaie de concatener avec la fonction strcat :  
 
 

Code :
  1. char ligne_lue[150]; //Ligne lue dans le fichier data.txt
  2. char mot[50];
  3. int iLigneLue=0; //Indice de parcour de la ligne lue
  4. .
  5. .
  6. .
  7. mot=strcat(mot, ligne_lue[iLigneLue]);


 
Et il me sort : Error:  PROJET_LIB.H(77,46):Cannot convert 'int' to 'const char *'
 
je veux bien que l'indice est en entier mais je concatene le contenu donc c'est pas un entier !! comrpend pas :( HELP  
 
P.S.: j'ai essayé de rechercher des posts sur le forum mais la recherche bloque... pour vous aussi?
 
A+ merci


Message édité par Schtroumpheur le 02-10-2002 à 15:49:53

---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 14:18:15   

Reply

Marsh Posté le 02-10-2002 à 14:25:30    

Schtroumpheur a écrit a écrit :

Bonjour, voila a partir d'un fichier je veux reconstituer un mot caractere par caractere mais voila ce qu'il me dit quand j'essaie de concatener avec la fonction strcat :  
 
 

Code :
  1. char ligne_lue[150]; //Ligne lue dans le fichier data.txt
  2. char mot[50];
  3. int iLigneLue=0; //Indice de parcour de la ligne lue
  4. .
  5. .
  6. .
  7. mot=strcat(mot, ligne_lue[iLigneLue]);


 
Et il me sort : Error:  PROJET_LIB.H(77,46):Cannot convert 'int' to 'const char *'
 
je veux bien que l'indice est en entier mais je concatene le contenu donc c'est pas un entier !! comrpend pas :( HELP  
 
P.S.: j'ai essayé de rechercher des posts sur le forum mais la recherche bloque... pour vous aussi?
 
A+ merci




 
salut,
 
au pif essaie avec un char *mot au lieu de mot[50], mais j'avoue que là je ne vois pas l'interet de faire un mot = strcat( ....


Message édité par barbarella le 02-10-2002 à 14:26:53
Reply

Marsh Posté le 02-10-2002 à 14:28:12    

pour le mot=... ben je savais pas si je devais mettre ca ou non, j'ai jamais utilisé cette fonction ...  
Je vais essayer ta soluce. merci


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 14:29:15    

il me dit pareil ! :(
 
je crois que c'est a cause du tableau indicé :/ mais je sais pas du tout comment faire pour que ca marche.


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 14:30:54    

Schtroumpheur a écrit a écrit :

il me dit pareil ! :(
 
je crois que c'est a cause du tableau indicé :/ mais je sais pas du tout comment faire pour que ca marche.




 
en faisant un char *mot, il te dit pareil ? t'es sur là ?

Reply

Marsh Posté le 02-10-2002 à 14:33:14    

yep :/
 
Error:  PROJET_LIB.H(77,46):Cannot convert 'int' to 'const char *'
 


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 14:34:24    

Schtroumpheur a écrit a écrit :

il me dit pareil ! :(
 
je crois que c'est a cause du tableau indicé :/ mais je sais pas du tout comment faire pour que ca marche.




 
ok, j'ai vu l'erreur dans ton prob. c'est le ligne_lue[iLigneLue] il ne correspond pas a une adresse.
 

Reply

Marsh Posté le 02-10-2002 à 14:35:12    

ligne_lue[iLigneLue]
 
-> caractère à la position "ilignelue" dans la chaine ligne_lue
 
un caractère c'est un octet
le type le plus proche pour lui est peut-être l'entier
ici il te demande un pointeur sur une chaine
 
donc:
&ligne_lue[iLigneLue]
 
pour donner l'adresse du caractère
 
ça c'est pour le problème de compil
reste que le ilignelue est bizarre :heink: je vois pas à quoi il sert
puis c'est dangereux : tu concatènes à une chaine de max 50 caractères une chaine qui en fait max 150 ! tu risques de vite dépasser les 50 caractères...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-10-2002 à 14:38:41    

Schtroumpheur a écrit a écrit :

Bonjour, voila a partir d'un fichier je veux reconstituer un mot caractere par caractere mais voila ce qu'il me dit quand j'essaie de concatener avec la fonction strcat :  
 
 

Code :
  1. char ligne_lue[150]; //Ligne lue dans le fichier data.txt
  2. char mot[50];
  3. int iLigneLue=0; //Indice de parcour de la ligne lue
  4. mot=strcat(mot, ligne_lue[iLigneLue]);


 
 




 
#include <string.h> /* a ajouter */
 
strcpy(mot,strncat(mot,ligne_lue,strlen(mot)+strlen(ligne_lue)));
/* la tu copie correctement le retour de la chaine concatenee !! */
et mets plutot mot plus grand que 150 car tu concatenes donc rajoute des chars


Message édité par nicolasm le 02-10-2002 à 14:40:07
Reply

Marsh Posté le 02-10-2002 à 14:44:31    

nicolasm a écrit a écrit :

 
 
#include <string.h> /* a ajouter */
 
strcpy(mot,strncat(mot,ligne_lue,strlen(mot)+strlen(ligne_lue)));
/* la tu copie correctement le retour de la chaine concatenee !! */
et mets plutot mot plus grand que 150 car tu concatenes donc rajoute des chars




 
c'est quoi ce brol ?  
   char a[50] = "a", b[50] = "b";
   strcat(a, b);
-> a vaut "ab" pas besoin de recopier le résultat, strcat modifie la variable que tu lui passe (et d'ailleurs il te renvoie un pointeur vers la variable de destination, pointeur inutile dans la majorité des cas)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-10-2002 à 14:44:31   

Reply

Marsh Posté le 02-10-2002 à 14:47:41    

Ok merci a tous .
 
Je v essayer de me démerder avec tout ca merci.


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 14:50:06    

ANTP a raison : ligne_lue[iLigneLue] est un caractère et non une chaîne !
Ce que tu peux faire :

Code :
  1. char **ligne_lue;
  2. register int i;
  3. ligne_lue = (char **) malloc(nb_ligne * sizeof(char *));
  4. for (i = 0; i < nb_ligne; i++)
  5. {
  6. ligne_lue[i] = (char *) malloc(150 * sizeof(char));
  7. }


Bien entendu, je suppose que tu veux un tableau contenant des chaines de caractères, que tu connait ce nombre (nb_ligne). Et du coup, il vaut mieux fair attention à la longueur de ton mot[50] qui risque d'être un peu trop petit comme te l'a signalé ANTP

Reply

Marsh Posté le 02-10-2002 à 15:09:08    

antp a écrit a écrit :

 
 
c'est quoi ce brol ?  
   char a[50] = "a", b[50] = "b";
   strcat(a, b);
-> a vaut "ab" pas besoin de recopier le résultat, strcat modifie la variable que tu lui passe (et d'ailleurs il te renvoie un pointeur vers la variable de destination, pointeur inutile dans la majorité des cas)




 
J'ai fais comme tu as dis + ou - et ca marche, mais a moitier
 
strcat(LC_pCourant->nom, &ligne_lue[iLigneLue]);
 
en fait il me concatene bien mais le prob c'est que c'est pas le caractere a la position iLigneLue, mais tout les caracteres a partir de cette position, ce qui est logique vu qu'on lui donne l'adresse de ce caractere, comment faire pour eviter ca?  
 
Merci


Message édité par Schtroumpheur le 02-10-2002 à 15:09:51

---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 15:12:29    

si tu veux juste un caractère tu dois pas utiliser strcat, mais strncat et passer 1 comme dernier paramètre


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-10-2002 à 15:13:09    

tu peux aussi faire:
 
p = strlen(mot);
mot[p] = ligne_lue[ilignelue];
mot[p+1] = 0;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-10-2002 à 15:13:29    

antp a écrit a écrit :

si tu veux juste un caractère tu dois pas utiliser strcat, mais strncat et passer 1 comme dernier paramètre
 




 
ha ca sert a ca strncat, merci bien.


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 15:23:12    

BB138 a écrit a écrit :

ANTP a raison : ligne_lue[iLigneLue] est un caractère et non une chaîne !
Ce que tu peux faire :

Code :
  1. char **ligne_lue;
  2. register int i;
  3. ligne_lue = (char **) malloc(nb_ligne * sizeof(char *));
  4. for (i = 0; i < nb_ligne; i++)
  5. {
  6. ligne_lue[i] = (char *) malloc(150 * sizeof(char));
  7. }


Bien entendu, je suppose que tu veux un tableau contenant des chaines de caractères, que tu connait ce nombre (nb_ligne). Et du coup, il vaut mieux fair attention à la longueur de ton mot[50] qui risque d'être un peu trop petit comme te l'a signalé ANTP
 




 
tut, c'est moi qui l'est vu le premier :D, bon treffle de plaisanterie,  
 
p = strlen(mot);  
mot[p] = ligne_lue[ilignelue];  
mot[p+1] = 0;
 
la solution de Antp est la plus adéquate, car de toute manière strcat ou strncat, ce n'est pas très performant :(

Reply

Marsh Posté le 02-10-2002 à 15:26:06    

barbarella a écrit a écrit :

 
 
tut, c'est moi qui l'est vu le premier :D, bon treffle de plaisanterie,  
 
p = strlen(mot);  
mot[p] = ligne_lue[ilignelue];  
mot[p+1] = 0;
 
la solution de Antp est la plus adéquate, car de toute manière strcat ou strncat, ce n'est pas très performant :(




Salut j'ai fais comme antp m'as dit la ca fonctionne nickel ;)
En quoi strncat n'est pas performant? Lenteur d'execution?  
Merci


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Marsh Posté le 02-10-2002 à 15:35:17    

Schtroumpheur a écrit a écrit :

 
Salut j'ai fais comme antp m'as dit la ca fonctionne nickel ;)
En quoi strncat n'est pas performant? Lenteur d'execution?  
Merci




 
oui, dans le cadre d'une optimisation de prog, il est souhaitable d'éviter strcat

Reply

Marsh Posté le 02-10-2002 à 15:49:30    

ok merci
 
mais dans un premier temps je ferai avec ca  
 
tkx a+


---------------
J'ai une pierre à la place du coeur, et au milieu de cette pierre il y a un coeur.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed