Passage d'argument pour printf [Résolu]

Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 09:45 - Dernière réponse : meech 209 Messages postés vendredi 11 avril 2003Date d'inscription 14 août 2007 Dernière intervention
- 4 avril 2006 à 12:21
Bonjour

Je cherche à créer une fonction qui aura le même effet que printf, c'est à dire que je passerais à cette fonction une liste de paramètre du même gabarit que ceux utilisé pour 'printf'.

J'ai déjà fait ce bout de code exemple, mais il ne fonctrionne pas (je ne suis meme pas sûr qu'il faille passé par les vaList).

#include <stdio.h>
#include <stdarg.h>
#include <conio.h>

typedef int BOOL;
#define TRUE (1)
#define FALSE (0)

BOOL myPrint(char *psText,...){
va_list listArg;
printf(psText, listArg);
return TRUE;
}

int main(int argc,char **argv){
int iTmp = 8;

myPrint("J ai %d fraises", iTmp);

getch();
return 0;
}

Merci d'avance de l'aide que vous pourriez m'apportez, en espérant avoir une réponse rapidement, du moins pour savoir si je fais fausse route ;)

Vers l'infini et au delà... [Q]
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_Mr.X 119 Messages postés mercredi 22 octobre 2003Date d'inscription 2 novembre 2007 Dernière intervention - 4 avril 2006 à 10:58
3
Merci
#include <stdio.h>
#include <stdarg.h>
#include <conio.h>

typedef int BOOL;
#define TRUE (1)
#define FALSE (0)


BOOL myPrint(char *psText,...){

va_list listArg;

va_start(listArg, psText);

char buffer[256];



vsprintf(buffer, psText, listArg);
printf("%s", buffer);
return TRUE;
}

int main(int argc,char **argv){
int iTmp = 8;

myPrint("J ai %d fraises", iTmp);

getch();
return 0;
}

Merci cs_Mr.X 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_Mr.X
Meilleure réponse
cs_magma 198 Messages postés vendredi 4 avril 2003Date d'inscription 18 mars 2011 Dernière intervention - 4 avril 2006 à 11:18
3
Merci
int myPrint(char *psText, ...)
{
int r;
va_list listArg;
va_start(listArg, psText);
r = vprintf(psText, listArg);
va_end(listArg);
return r;
}

Merci cs_magma 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_magma
platon179 237 Messages postés lundi 20 mai 2002Date d'inscription 22 juillet 2011 Dernière intervention - 4 avril 2006 à 09:54
0
Merci
Salut :)

Il te manque une instruction apres va_list listArg :

va_start(pa, psText);

Bonne journée @+
Commenter la réponse de platon179
Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 10:00
0
Merci
Malheureusement j ai deja essayé. (en rectifiant 'pa' par 'psText)

Résultat: j ai 1244672 faises

Ce qui est assez embetant en fait... :(

Vers l'infini et au delà... [Q]
Commenter la réponse de Quazar
Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 10:02
0
Merci
'pa' par listArg, pardon...

Vers l'infini et au delà... [Q]
Commenter la réponse de Quazar
Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 11:11
0
Merci
Je te remercie, je me retrouve bien avec huit fraises ;) Et en bonus, je comprend un peu mieux comment se comporte la <stdarg.h>... le bonheur quoi ;)

Merci encore.

Vers l'infini et au delà... [Q]
Commenter la réponse de Quazar
Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 11:23
0
Merci
Merci encore, c'est la fete.. c'est encore plus ce que je voulais faire ;) Et en plus y a le va_end qui n'y etait pas avant ;)

Vers l'infini et au delà... [Q]
Commenter la réponse de Quazar
meech 209 Messages postés vendredi 11 avril 2003Date d'inscription 14 août 2007 Dernière intervention - 4 avril 2006 à 11:53
0
Merci
Salut,

Ci-dessous un code sous licence GPL : une fonction printf sans l'utilisation de stdarg.h.
Ca peut être pratique si, un jour, ton code doit être porté vers Windows/Visual C++...

/*
Copyright 2001, 2002 Georges Menie (www.menie.org)


This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.


This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.


You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/


/*
putchar is the only external dependency for this file,
if you have a working putchar, just remove the following
define. If the function should be called something else,
replace outbyte(c) by your own function call.
*/
//#define putchar(c) outbyte(c)


static void printchar(char **str, int c)
{
extern int putchar(int c);
if (str) {
**str = c;
++(*str);
}
else (void)putchar(c);
}


#define PAD_RIGHT 1
#define PAD_ZERO 2


static int prints(char **out, const char *string, int width, int pad)
{ register int pc 0, padchar ' ';


if (width > 0) {
register int len = 0;
register const char *ptr;
for (ptr = string; *ptr; ++ptr) ++len; if (len >width) width 0;
else width -= len;
if (pad & PAD_ZERO) padchar = '0';
}
if (!(pad & PAD_RIGHT)) {
for ( ; width > 0; --width) {
printchar (out, padchar);
++pc;
}
}
for ( ; *string ; ++string) {
printchar (out, *string);
++pc;
}
for ( ; width > 0; --width) {
printchar (out, padchar);
++pc;
}


return pc;
}


/* the following should be enough for 32 bit int */
#define PRINT_BUF_LEN 12


static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
{
char print_buf[PRINT_BUF_LEN];
register char *s; register int t, neg 0, pc 0;
register unsigned int u = i;


if (i == 0) {
print_buf[0] = '0';
print_buf[1] = '\0';
return prints (out, print_buf, width, pad);
}


if (sg && b == 10 && i < 0) {
neg = 1;
u = -i;
}


s = print_buf + PRINT_BUF_LEN-1;
*s = '\0';


while (u) {
t = u % b;
if( t >= 10 )
t += letbase - '0' - 10;
*--s = t + '0';
u /= b;
}


if (neg) {
if( width && (pad & PAD_ZERO) ) {
printchar (out, '-');
++pc;
--width;
}
else {
*--s = '-';
}
}


return pc + prints (out, s, width, pad);
}


static int print(char **out, int *varg)
{
register int width, pad;
register int pc = 0;
register char *format = (char *)(*varg++);
char scr[2];


for (; *format != 0; ++format) {
if (*format == '%') {
++format; width pad 0;
if (*format == '\0') break;
if (*format == '%') goto out;
if (*format == '-') {
++format;
pad = PAD_RIGHT;
}
while (*format == '0') {
++format;
pad |= PAD_ZERO;
}
for ( ; *format >= '0' && *format <= '9'; ++format) {
width *= 10;
width += *format - '0';
}
if( *format == 's' ) {
register char *s = *((char **)varg++);
pc += prints (out, s?s:"(null)", width, pad);
continue;
}
if( *format == 'd' ) {
pc += printi (out, *varg++, 10, 1, width, pad, 'a');
continue;
}
if( *format == 'x' ) {
pc += printi (out, *varg++, 16, 0, width, pad, 'a');
continue;
}
if( *format == 'X' ) {
pc += printi (out, *varg++, 16, 0, width, pad, 'A');
continue;
}
if( *format == 'u' ) {
pc += printi (out, *varg++, 10, 0, width, pad, 'a');
continue;
}
if( *format == 'c' ) {
/* char are converted to int then pushed on the stack */
scr[0] = *varg++;
scr[1] = '\0';
pc += prints (out, scr, width, pad);
continue;
}
}
else {
out:
printchar (out, *format);
++pc;
}
}
if (out) **out = '\0';
return pc;
}


/* assuming sizeof(void *) == sizeof(int) */


int printf(const char *format, ...)
{
register int *varg = (int *)(&format);
return print(0, varg);
}


int sprintf(char *out, const char *format, ...)
{
register int *varg = (int *)(&format);
return print(&out, varg);
}


#ifdef TEST_PRINTF
int main(void)
{
char *ptr = "Hello world!";
char *np = 0;
int i = 5;
unsigned int bs = sizeof(int)*8;
int mi;
char buf[80];


mi = (1 << (bs-1)) + 1;
printf("%s\n", ptr);
printf("printf test\n");
printf("%s is null pointer\n", np);
printf("%d = 5\n", i);
printf("%d = - max int\n", mi);
printf("char %c = 'a'\n", 'a');
printf("hex %x = ff\n", 0xff);
printf("hex %02x = 00\n", 0); printf("signed %d unsigned %u hex %x\n", -3, -3, -3);
printf("%d %s(s)%", 0, "message");
printf("\n");
printf("%d %s(s) with %%\n", 0, "message");
sprintf(buf, "justif: "%-10s"\n", "left"); printf("%s", buf);
sprintf(buf, "justif: "%10s"\n", "right"); printf("%s", buf);
sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);
sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);
sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);
sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);
sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);


return 0;
}


/*
* if you compile this file with
* gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
* you will get a normal warning:
* printf.c:214: warning: spurious trailing `%' in format
* this line is testing an invalid % at the end of the format string.
*
* this should display (on 32bit int machine) :
*
* Hello world!
* printf test
* (null) is null pointer
* 5 = 5
* -2147483647 = - max int
* char a = 'a'
* hex ff = ff
* hex 00 = 00 * signed -3 unsigned 4294967293 hex fffffffd
* 0 message(s)
* 0 message(s) with %
* justif: "left "
* justif: " right"
* 3: 0003 zero padded
* 3: 3 left justif.
* 3: 3 right justif.
* -3: -003 zero padded
* -3: -3 left justif.
* -3: -3 right justif.
*/


#endif


En espérant que cela soit utile,
Ciao.
Commenter la réponse de meech
Quazar 84 Messages postés mardi 19 octobre 2004Date d'inscription 6 octobre 2006 Dernière intervention - 4 avril 2006 à 12:02
0
Merci
Merci encore mais je suis deja sous Windows, cependant ce morceau de code est interessant ;)

Vers l'infini et au delà... [Q]
Commenter la réponse de Quazar
meech 209 Messages postés vendredi 11 avril 2003Date d'inscription 14 août 2007 Dernière intervention - 4 avril 2006 à 12:21
0
Merci
Ah, pardon, je croyais que MS Visual C++ ne supportait pas le stdarg.h ...
A plus tard.
Commenter la réponse de meech

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.