concatener des "phrases" dans un char*

concatener des "phrases" dans un char* - C - Programmation

Marsh Posté le 13-11-2005 à 10:46:46    

Bonjour,
 
J'aimerais vous poser une question.
 
Voici un bout de code
 
void single_converter(char* input_currency, double input_amount) {
int i;
double resultat;
char* output_currency = (char*) malloc(sizeof(char)*3);
 
printf("Conversion pour: %s %f.\n",input_currency,input_amount);
 
for (i=0; i<5; i++) {
output_currency = determine_currency(i);
resultat = convert(input_currency,output_currency, input_amount);
printf("%s %.3f\n",output_currency,resultat);
}
}
 
J'aimerais que les affichages des differents printf soient ecrits dans un char*.
 
C'est pour un tme d'info, en fait on doit utiliser les tubes, et faut qu'en fait, que le processus fils transmette les resultats au père et donc ca m'aurait arrangé que toutes ces phrases là soient dans le char*.
 
J'ai voulu au debut tester en mettant des sprintf au lieu des printf, pour sauvegarder à chaque fois les differents affichages dans le char*, mais à chaque sprintf, malheuresement, il ecrase ce qu'il y avait avant et resultat, à la fin on a juste dans le char*, la dernière phrase...
 
J'ai aussi eu l'idee, d'ecrire de creer un char** temporaire, pour que chaque phrase soit ecrise dans une case du tableau, mais après faudra quand même concatener chaque case du char** avec le char*.
 
J'ai eu aussi l'idee d'utiliser strcat, mais le pb ,c'est qu'il faut absolument que le char* de destination soit vide, sinon ca marche pas Sad.
 
Quelqu'un a une idée simple et efficace lol?
 
Merci
A+

Reply

Marsh Posté le 13-11-2005 à 10:46:46   

Reply

Marsh Posté le 13-11-2005 à 11:15:31    

strcpy/sprintf/strcat j'vois rien d'autre.
Apres a toi de bien gerer le char* de destination.


Message édité par Joel F le 13-11-2005 à 11:16:18
Reply

Marsh Posté le 13-11-2005 à 12:42:39    

thierry_b a écrit :

J'ai voulu au debut tester en mettant des sprintf au lieu des printf, pour sauvegarder à chaque fois les differents affichages dans le char*, mais à chaque sprintf, malheuresement, il ecrase ce qu'il y avait avant et resultat, à la fin on a juste dans le char*, la dernière phrase...


Normal si t'as mis à chaque fois la même destination !!!
sprintf(dest, "%s", "Hello " )
sprintf(dest + 6 "%s", "World" )
=> dest contiendra "Hello World"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-11-2005 à 17:11:20    

Et attention au dépassement de capacité. C'est chiant le C pour ça.

Reply

Marsh Posté le 13-11-2005 à 20:34:12    

Ton idée de mettre tes réponses dans un tableau était bonne :
 
char * single_converter(char* input_currency, double input_amount) {  
  int i;  
  double resultat;  
  char tmp[128]; // buffre d'écriture temporaire, j'ai pris 128 mais tu peux prendre plus
  char *tab[5]; // tableau de mémorisation des chaînes
  int len; // pour calculer la longueur de la chaîne finale
  char* output_currency;  // = (char*) malloc(sizeof(char)*3);  
  // à quoi sert ce malloc puisque tu détruis l'adresse juste après ??
 
  printf("Conversion pour: %s %f.\n",input_currency,input_amount);  
 
  for (i=len=0; i<5; i++) {  
     // destruction de l'adresse du output_currency
    output_currency = determine_currency(i);  
    resultat = convert(input_currency,output_currency, input_amount);  
    sprintf(tmp, "%s %.3f\n",output_currency,resultat);  
    tab[i++] = strdup(tmp);
     len += strlen(tmp) + 1; // pour les séparareurs éventuels à ajouter
  }  
  //  on alloue maintenant la longueur +1 pour l'espace final
  output_currency = malloc(len + 1);
  if (output_currency != NULL)
  {
     *output_currency = 0;
     for(i = 0; i < 5; i++)
       sprintf(output_currency + strlen(output_currency), "%s ", tab[i]);
  }
  // on désalloue tab[i];
  for(i = 0; i < 5; i++)
     free(tab[i]);
  return output_currency;
}  
 
Il ne faudra oublier de tester le retour de  retour de single_converter et de liberer par free le retour après utilisation.

Reply

Sujets relatifs:

Leave a Replay

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