Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1463 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Concaténer une chaine de caractère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Concaténer une chaine de caractère

n°275683
podd
Posté le 25-12-2002 à 12:23:51  profilanswer
 

Bonjour a tous et joyeux noel :)
Voila j'ai un probléme je voudrais mettre dans une variable poly 2 autres variables déclarées en int contenant par exemple 2 et 4. entre les 2 variables temp et stock déclarées en int je voufrais mettre en fixe "X^". donc poly doit donner 2X^4.
Comment dois je faire ?
Merci d'avance pour vos réponses.


Message édité par podd le 25-12-2002 à 12:24:27
mood
Publicité
Posté le 25-12-2002 à 12:23:51  profilanswer
 

n°275686
*syl*
--> []
Posté le 25-12-2002 à 13:08:47  profilanswer
 

C, C++ ?

n°275734
podd
Posté le 25-12-2002 à 17:14:12  profilanswer
 

ça serai en C.

n°275737
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 25-12-2002 à 17:30:12  profilanswer
 

je capte rien alors je me réfère au titre: strcat(destination, source) ou strncat(destination, source, taille_ma_destination) tout ca dans <string.h>


---------------
du bon usage de rand [C] / [C++]
n°275745
youdontcar​e
Posté le 25-12-2002 à 17:55:37  profilanswer
 

je comprends ça comme :
 
int temp = 2;
int stock = 4;
char poly[256];
 
sprintf(poly, "%dX^%d", temp, stock);

n°275751
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 25-12-2002 à 19:12:52  profilanswer
 

youdontcare a écrit :

je comprends ça comme :
 
int temp = 2;
int stock = 4;
char poly[256];
 
sprintf(poly, "%dX^%d", temp, stock);

:non:  :pfff:  
 
 
 
 

Code :
  1. const size_t buffer_size=256;
  2. int temp = 2;
  3. int stock = 4;
  4. char poly[buffer_size];
  5. snprintf(poly, "%dX^%d", buffer_size, temp, stock);

est bien mieux car plus sur


---------------
du bon usage de rand [C] / [C++]
n°275797
MrTonio
Posté le 25-12-2002 à 22:10:44  profilanswer
 

Code :
  1. int temp = 2;
  2. int stock = 4;
  3. char *poly = NULL;
  4. asprintf(&poly, "%dX^%d", temp, stock);


 
ca oci c est bien  :p  
mais ca marche ke sous nunux  :(


---------------
WoIP - Video and Voice over IP -  http://www.woip.net/
n°275810
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 00:27:22  profilanswer
 

ouais mais là c'est l'artillerie lourde puisque de asprintf fait appel à malloc


---------------
du bon usage de rand [C] / [C++]
n°275845
podd
Posté le 26-12-2002 à 09:50:13  profilanswer
 

Je vous remercie tous pour vos réponses je vais tester ça de suite et je suis pas sous nunux.

n°277302
karim63
Posté le 30-12-2002 à 01:05:05  profilanswer
 

podd a écrit :

Je vous remercie tous pour vos réponses je vais tester ça de suite et je suis pas sous nunux.


 
---> Cygwin  :whistle:

mood
Publicité
Posté le 30-12-2002 à 01:05:05  profilanswer
 

n°277310
nraynaud
lol
Posté le 30-12-2002 à 01:32:28  profilanswer
 

Taz@PPC a écrit :

:non:  :pfff:  
 
 
 
 

Code :
  1. const size_t buffer_size=256;
  2. int temp = 2;
  3. int stock = 4;
  4. char poly[buffer_size];
  5. snprintf(poly, "%dX^%d", buffer_size, temp, stock);

est bien mieux car plus sur


 
ça ne t'offre pas de garanties sur le résultat, c'est du code défensif et ça pue. Tu dois au minimum vérifier que ta chaine était assez longue et refaire une tentative jusqu'à ce que l'opération se soit déroulée correctement ou planter tout comme une grosse bouse (ce qui en C s'appelle abort()), mais surtout ne pas continuer avec un truc à moitié douteux (chaîne tronquée en l'occurence).
 
Ne fait pas de leçons sur des sujets que tu ne maîtrises pas.

n°277924
weed
Posté le 31-12-2002 à 18:43:23  profilanswer
 

je me tais parce que je connais pas la cmde
ms please poins d'agressivité  :pt1cable:

n°277999
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 01-01-2003 à 14:41:15  profilanswer
 

nraynaud a écrit :


 
ça ne t'offre pas de garanties sur le résultat, c'est du code défensif et ça pue. Tu dois au minimum vérifier que ta chaine était assez longue et refaire une tentative jusqu'à ce que l'opération se soit déroulée correctement ou planter tout comme une grosse bouse (ce qui en C s'appelle abort()), mais surtout ne pas continuer avec un truc à moitié douteux (chaîne tronquée en l'occurence).
 
Ne fait pas de leçons sur des sujets que tu ne maîtrises pas.

:heink: voila: je rentre je tombe directe sur ton message et je suis de mauvaise humeur. je comprends pas trop pourquoi du code défensif est mauvais? et me prends pas pour plus bete je ne le suis: bien evidemment qu'on a interet à regarder le code de retour de snprintf pour s'assurer que tout s'est passé comme désiré


---------------
du bon usage de rand [C] / [C++]
n°280687
nraynaud
lol
Posté le 07-01-2003 à 01:47:23  profilanswer
 

Taz@PPC a écrit :

:heink: voila: je rentre je tombe directe sur ton message et je suis de mauvaise humeur. je comprends pas trop pourquoi du code défensif est mauvais? et me prends pas pour plus bete je ne le suis: bien evidemment qu'on a interet à regarder le code de retour de snprintf pour s'assurer que tout s'est passé comme désiré


 
Ben pareil, j'étais encore en vacances quand je suis tombé là-dessus, ça m'a énervé ces conneries de nmachin. La bonne attitude n'est pas de faire un nmachin, la bonne attiude est de t'assurer que le résultat attendu est arrivé (c'est à dire te manger une exception si ça commence à chier), pas d'essayer de continuer dans n'importe quelles conditions.
Ne vous plaignez pas que les applications que vous utilisez tous les jours plantent alors que vous utilisez les techniques qui leurs ont permis de planter.
 
en savoir plus sur la qualité : http://www.eyrolles.com/php.inform [...] 091113.php il explique pourquoi c'est inutile et ralentissant (je sais, c'est étonnant) le code défensif ; c'est 400 balles bien placé, et crois-moi, c'est un mec qui a l'habitude de les placer au bar qui te le dit.
 
C'est marrant, mon prof de gestion de projet l'a eu comme prof pendant ses études en 1978, il parlait déjà de Z et de tous les trucs qui lui ont permit de faire avancer la qualité aujourd'hui (les études de mon prof, Meyer enseigne actuellement en Suisse après avoir fondé sa boite aux US).

n°280689
Taz
bisounours-codeur
Posté le 07-01-2003 à 02:02:22  profilanswer
 

tu captes rien ou quoi? :kaola:
 
 
si t'es pas sure (et on ne l'ai jamais assez) que ton buffer soit assez grand, tu utlises snprintf qui t'evites une jolie erreur de segmentation. si snprintf t'indique qu'elle n'a pu imprimer autant d'élément que désiré, autrement dit que ton buffer était trop petit, tu n'as qu'a réalloué et ressayé. une fois que tout est bon, tu continues. Apres si tu as quelque chose à dire contre ça, c'est que vraiment on n'est pas sur la meme planete

n°280696
KrisCool
“Verbeux„
Posté le 07-01-2003 à 03:14:30  profilanswer
 

++Taz a écrit :

tu captes rien ou quoi? :kaola:
 
 
si t'es pas sure (et on ne l'ai jamais assez) que ton buffer soit assez grand, tu utlises snprintf qui t'evites une jolie erreur de segmentation. si snprintf t'indique qu'elle n'a pu imprimer autant d'élément que désiré, autrement dit que ton buffer était trop petit, tu n'as qu'a réalloué et ressayé. une fois que tout est bon, tu continues. Apres si tu as quelque chose à dire contre ça, c'est que vraiment on n'est pas sur la meme planete


 
Tu n'est pas sur la même planète. Les nfonctions permettent d'éviter des désagréments certains, mais on peut s'en passer. Mais sans être aussi extrémiste que nraynaud, je pense quand même qu'elles constituent un confort d'utilisation certain pour les utilisateurs.
 
Maintenant il est clair que compter sur elles pour éviter les débordements de buffer bien calibrés (c'est à dire qui font pas segfault, mais qui vont corrompre la pile et faire des choses douteuses, comme changer l'adresse de retour de la fonction en cours par exemple) n'est pas une bonne solution.

n°280697
Taz
bisounours-codeur
Posté le 07-01-2003 à 03:18:23  profilanswer
 

KrisCool a écrit :


 
Tu n'est pas sur la même planète. Les nfonctions permettent d'éviter des désagréments certains, mais on peut s'en passer. Mais sans être aussi extrémiste que nraynaud, je pense quand même qu'elles constituent un confort d'utilisation certain pour les utilisateurs.
 
Maintenant il est clair que compter sur elles pour éviter les débordements de buffer bien calibrés (c'est à dire qui font pas segfault, mais qui vont corrompre la pile et faire des choses douteuses, comme changer l'adresse de retour de la fonction en cours par exemple) n'est pas une bonne solution.

je comprends rien...
 
OK pour ton premier paragraphe: on peut s'en passer si on sait ce qu'on fait:
 
char buffer[100];
spirntf(buffer, "%d", 1);
 
doit apriori ne pas poser de problème.
 
mais alors pour ton deuxieme paragraphe, la je nage... Qu'est ce que tu entends par "pas compter sur elles" ? Evidemment si tu rentres un n qui ne correspond pas à la réalité...
 
EXpliquez moi, s'il vous plait, en quoi on peut critiquer ce code (extrait du man)
 

Code :
  1. /* Construct a message describing the value of a variable whose name is NAME and whose value is VALUE. */
  2. char * make_message (char *name, char *value)
  3. {
  4. /* Guess we need no more than 100 chars of space. */
  5.   int size = 100;
  6.   char *buffer = (char *) xmalloc (size);
  7.   while (1)
  8.   {
  9.    /* Try to print in the allocated space. */
  10.    int nchars = snprintf (buffer, size, "value of %s is %s", name, value);
  11.    /* If that worked, return the string. */
  12.    if (nchars > -1 && nchars < size)
  13.        return buffer;
  14.    /* Else try again with more space. */
  15.    if (nchars > -1)
  16.        size = nchars+1;  /* precisely what is needed */
  17.    else
  18.        size *= 2;        /* twice the old size */
  19.    buffer = (char *) xrealloc (buffer, size);
  20.   }
  21. }


Message édité par Taz le 07-01-2003 à 03:36:37
n°280703
LeGreg
Posté le 07-01-2003 à 05:01:12  profilanswer
 

nraynaud a écrit :


en savoir plus sur la qualité : http://www.eyrolles.com/php.inform [...] 091113.php il explique pourquoi c'est inutile et ralentissant (je sais, c'est étonnant) le code défensif ; c'est 400 balles bien placé, et crois-moi, c'est un mec qui a l'habitude de les placer au bar qui te le dit.


 
ton lien ne marche pas..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
n°280709
Musaran
Cerveaulté
Posté le 07-01-2003 à 07:24:02  profilanswer
 

C'est la solution sûre, mais c'est aussi beaucoup pour un débutant, et ça amène d'autres problèmes:

  • Pourquoi xmalloc, xrealloc ?
  • Les allocations ne sont pas testées. C'est ça la différence x ?
  • Il faudra penser à libérer la chaîne obtenue.
  • Et si on ne veut pas d'allocation ?
  • Quelle genre de gestion d'erreur veut-on ?


Bref, je préfères C++.


Message édité par Musaran le 07-01-2003 à 07:24:44

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°280723
nraynaud
lol
Posté le 07-01-2003 à 07:57:20  profilanswer
 

legreg a écrit :


 
ton lien ne marche pas..
 
LeGreg


'tain bizarre, il marchait hier !
 
Conception et programmation objet de Bertrand Meyer chez eyrolles.

n°280724
nraynaud
lol
Posté le 07-01-2003 à 08:07:50  profilanswer
 

++Taz a écrit :


mais alors pour ton deuxieme paragraphe, la je nage... Qu'est ce que tu entends par "pas compter sur elles" ? Evidemment si tu rentres un n qui ne correspond pas à la réalité...
 
EXpliquez moi, s'il vous plait, en quoi on peut critiquer ce code (extrait du man)
 

Code :
  1. /* Construct a message describing the value of a variable whose name is NAME and whose value is VALUE. */
  2. char * make_message (char *name, char *value)
  3. {
  4. /* Guess we need no more than 100 chars of space. */
  5.   int size = 100;
  6.   char *buffer = (char *) xmalloc (size);
  7.   while (1)
  8.   {
  9.    /* Try to print in the allocated space. */
  10.    int nchars = snprintf (buffer, size, "value of %s is %s", name, value);
  11.    /* If that worked, return the string. */
  12.    if (nchars > -1 && nchars < size)
  13.        return buffer;
  14.    /* Else try again with more space. */
  15.    if (nchars > -1)
  16.        size = nchars+1;  /* precisely what is needed */
  17.    else
  18.        size *= 2;        /* twice the old size */
  19.    buffer = (char *) xrealloc (buffer, size);
  20.   }
  21. }




 
je ne critiquerais pas ce bout de code car il a largement plus qu'un simple nmachin, il fournit l'assurance que le snprintf aura  bien lieu jusqu'au bout de la chaine et ne sera pas tronqué, tu peux donc continuer ton programme sans crainte. Tu peux filer ta chaine à l'utilisateur (ce qui est parfois possible même avec une chaine tronquée) mais surtout la foutre dans un parser etc., ce que tu ne pourrais pas faire avec une chaine tronquée.

n°280850
Taz
bisounours-codeur
Posté le 07-01-2003 à 10:46:04  profilanswer
 

Musaran a écrit :

C'est la solution sûre, mais c'est aussi beaucoup pour un débutant, et ça amène d'autres problèmes:

  • Pourquoi xmalloc, xrealloc ?
  • Les allocations ne sont pas testées. C'est ça la différence x ?
  • Il faudra penser à libérer la chaîne obtenue.
  • Et si on ne veut pas d'allocation ?
  • Quelle genre de gestion d'erreur veut-on ?


Bref, je préfères C++.


 
j'ai dit que c'était l'extrait du man. xmalloc et xealloc sont des wrapper de malloc et realloc qui stoppe le programme en cas d'échec (l'auteur de cette fonction s'est débarassé de cette façon du test de retour de malloc)
 
et si on veut pas d'allocation? on ferme sa gueule  et on croise les doigts :sol:
 
quant au C++, ici ce n'est pas la question
 
nraynaud> fo pas me prendre pour beaucoup plus con que je le suis  :hello:. ça sert à rien d'apprendre directement aux débutants à blinder leur code puisque la plupart s'en foutront pendant encore un bon moment :( . Je n'ai jamais dit qu'un nmachin faisait tout tout seul :wahoo: Démonstration est faite qu'on peut avoir un truc assez costaud :sol:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Concaténer une chaine de caractère

 

Sujets relatifs
ASP : Passer une chaine de caractere en MAJUSCULE ?queue de messages : liste chainé
passer d'un nombre en hexa en caractère ASCIIsupprimer des caractères dans une chaîne ?
Fonctions pour passer un int vers un char et une chaine vers un int ?[VBSCRIPT]Ouvrir un fichier pour faire une recherche de caractere
Comment lit-on un caractère dans une chaine ?Problème de lecture chaine caractère
Plus de sujets relatifs à : Concaténer une chaine de caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR