Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

concatener des "phrases" dans un char*

8 réponses
Avatar
Thierry B
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 =3D (char*) malloc(sizeof(char)*3);

printf("Conversion pour: %s %f.\n",input_currency,input_amount);

for (i=3D0; i<5; i++) {
output_currency =3D determine_currency(i);
resultat =3D 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=E8re et
donc ca m'aurait arrang=E9 que toutes ces phrases l=E0 soient dans le
char*.

J'ai voulu au debut tester en mettant des sprintf au lieu des printf,
pour sauvegarder =E0 chaque fois les differents affichages dans le
char*, mais =E0 chaque sprintf, malheuresement, il ecrase ce qu'il y
avait avant et resultat, =E0 la fin on a juste dans le char*, la
derni=E8re 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=E8s faudra
quand m=EAme 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=E9e simple et efficace lol?

Merci
A+

8 réponses

Avatar
Pierre Maurette
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 %.3fn",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...
Je n'ai pas compris la suite. Ext-ce que ça vous aide:


char tablo[256];
int i = 0;
i += sprintf(tablo + i, "Pierre");
i += sprintf(tablo + i, " ");
i += sprintf(tablo + i, "Maurette");
puts(tablo);

Vous devrez choisir entre sprintf() et snprintf(), vous protéger du
dépassement, tester le retour, etc.
Vous pouvez ajouter un séparateur.


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+



--
Pierre Maurette

Avatar
Sylvain/11XX
Oui c'est une possibilité mais avec strcat je pense que c'est plus simple.


"Pierre Maurette" a écrit dans le message de
news:
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 %.3fn",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...
Je n'ai pas compris la suite. Ext-ce que ça vous aide:


char tablo[256];
int i = 0;
i += sprintf(tablo + i, "Pierre");
i += sprintf(tablo + i, " ");
i += sprintf(tablo + i, "Maurette");
puts(tablo);

Vous devrez choisir entre sprintf() et snprintf(), vous protéger du
dépassement, tester le retour, etc.
Vous pouvez ajouter un séparateur.


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+



--
Pierre Maurette





Avatar
Pierre Maurette
"Pierre Maurette" a écrit dans le message de
[...]

Je n'ai pas compris la suite. Ext-ce que ça vous aide:

char tablo[256];
int i = 0;
i += sprintf(tablo + i, "Pierre");
i += sprintf(tablo + i, " ");
i += sprintf(tablo + i, "Maurette");
puts(tablo);


Oui c'est une possibilité mais avec strcat je pense que c'est plus simple.
"Plus simple", c'est beaucoup une question de personne.

Personnellement, les pointeurs et leur arithmétique me parlent bien, et
les fonctions genre strcat() m'enduisent facilement d'erreur.
Avec strcat(), le même code serait celui-ci:

char tablo[256];
char dummy[32];
tablo[0] = '';
sprintf(dummy, "Pierre");
strcat(tablo, dummy);
sprintf(dummy, " ");
strcat(tablo, dummy);
sprintf(dummy, "Maurette");
strcat(tablo, dummy);
puts(tablo);

ou éventuellement (mais on "complique", surtout si on est dans une
boucle):

char tablo[256];
char dummy[32];
sprintf(tablo, "Pierre");
sprintf(dummy, " ");
strcat(tablo, dummy);
sprintf(dummy, "Maurette");
strcat(tablo, dummy);
puts(tablo);

Voilà pour la simplicité ressentie. Mais ici, il y a en plus une
différence objective entre les deux codes. Je sais bien que la
performance n'est pas le critère premier en général, mais là c'est
Waterloo, sans que le compilateur ne puisse optimiser. Je vous laisse
analyser, mais voyez simplement que chaque strcat(), outre un appel de
fonction, ajoute un scan à la recherche de '' et une copie de chaîne.

Le fait d'envoyer à l'écran le résultat du sprintf() ne changera pas
significativement (je n'écris pas "pas du tout") la comparaison entre
les deux solutions, puisqu'on va envoyer un pointeur à puts(). On peut
gagner un peu si on accepte 'n' comme séparateur.

Je ne vois pas *en C standard* de possibilité simple de cumuler la
fabrication d'un chaîne et la sortie stdout. Mais peut-être qu'un truc
évident m'échappe ...

--
Pierre Maurette


Avatar
Thierry B
Merci,
Finalement, j'ai trouvé comment faire avec strcat, car j'y arrivais
pas lol.

A+
Avatar
halfwolf
Bonjour,

Avec strcat(), le même code serait celui-ci:

char tablo[256];
char dummy[32];
tablo[0] = '';
sprintf(dummy, "Pierre");
strcat(tablo, dummy);
sprintf(dummy, " ");
strcat(tablo, dummy);
sprintf(dummy, "Maurette");
strcat(tablo, dummy);
puts(tablo);


J'avoue ne pas comprendre pourquoi utiliser dummy en tampon ? Pourquoi
pas juste :

char tablo[256];
tablo[0] = '';
strcat(tablo, "Pierre");
strcat(tablo, " ");
strcat(tablo, "Maurette");
puts(tablo);

HalfWolf

Avatar
Pierre Maurette
Bonjour,

Avec strcat(), le même code serait celui-ci:

char tablo[256];
char dummy[32];
tablo[0] = '';
sprintf(dummy, "Pierre");
strcat(tablo, dummy);
sprintf(dummy, " ");
strcat(tablo, dummy);
sprintf(dummy, "Maurette");
strcat(tablo, dummy);
puts(tablo);


J'avoue ne pas comprendre pourquoi utiliser dummy en tampon ? Pourquoi
pas juste :

char tablo[256];
tablo[0] = '';
strcat(tablo, "Pierre");
strcat(tablo, " ");
strcat(tablo, "Maurette");
puts(tablo);


Je réponds en même temps à Sylvain qui m'a par erreur envoyé en direct:

<cit>
Il me semble que ton code n'a pour but que de faire la preuve que c'est
pas bien.
Car le meme réécrit donnerais une chose du genre :

char tablo[256];

sprintf(tablo, "Pierre");
strcat(tablo, " Maurette");
puts(tablo);

Puis y'a aussi strcpy, ou les tableaux à 2D. J'aime aussi bcps les
pointeurs.

Tu en penses quoi ?
</cit>

La réponse est simple: parce que s'il s'agissait de concaténer des
chaînes constantes, sans nécessité de sprintf(), la question initiale
n'existerait pas !
sprintf(dummy, "Pierre");
ne fait que simuler un sprintf() avec une vraie chaîne de format. Par
exemple, pour reprendre partiellemnt le PO:
sprintf(dummy, "%s %.3f ","valeur:",f);

Désolé, je pensais que c'était implicite.

--
Pierre Maurette


Avatar
Pierre Maurette
Merci,
Finalement, j'ai trouvé comment faire avec strcat, car j'y arrivais
pas lol.


Il ne vous reste plus qu'à trouver l'endroit et la manière de déclarer
le tableau ou d'allouer le pointeur ;-)

Je me permets d'insister (une dernière fois, promis). Mes remarques
sont surtout vraies si vous avez des résultats de ?printf() à
concaténer, mélangés ou non avec des chaînes constantes ou des
variables chaînes.

Pensez qu'à chaque appel de strcat(), la chaîne cible va être parcourue
depuis le début jusqu'à la découverte de '', c'est à dire de plus en
plus loin. Et imaginez que vous utilisiez cette technique pour faire un
log. Oui, je sais, si ma tante en avait, ce serait mon oncle, mais bon.
Votre code va bien fonctionner au début, puis peu à peu se mettre à
ramer (*).
Je connais un gars (Pierre Maurette) qui a fait la même erreur il y a
quelques jour en PHP en proposant ça, calamiteux:
function IsNotUnique($cible, $array){
return in_array($cible, array_diff_assoc($array ,
array_unique($array)));
}

Et même pour la simplicité. Ce bout de code est censé faire une
concaténation élémentaire, avec également sortie écran de l'élément et
sécurisation.

tempo = snprintf(tablo + i, TAILLE - i, "%s %.3f","valeur:",f);
if(tempo < 0){/* erreur conversion, breaker */}
else if(!(tempo < TAILLE - i)){/* tablo trop petit, breaker */}
else
{
puts(tablo + i);
i += tempo;
}

Vous pouvez le placer dans une boucle, ou l'utiliser plusieurs fois.
Pour plusieurs raisons, vous auriez intérêt à le conserver même pour de
rares chaînes constantes.

Qu'est-ce que ça donne avec strcat() ?




(*) Il vaut mieux d'ailleurs pratiquement tout le temps un code qui
semble un peu plus lent mais constant à un autre fortement dépendant de
conditions externes.

--
Pierre Maurette

Avatar
halfwolf
Pierre Maurette wrote:
J'avoue ne pas comprendre pourquoi utiliser dummy en tampon ?
La réponse est simple: parce que s'il s'agissait de concaténer des

chaînes constantes, sans nécessité de sprintf(), la question initia le
n'existerait pas !


Ok, moi aussi je préfère l'arithmétique des pointeurs avec le
sprintf.

HalfWolf