Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Passage d'argument pour printf [ Archives / Divers ] (Quazar)

mardi 4 avril 2006 à 09:45:12 | Passage d'argument pour printf

Quazar

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]

mardi 4 avril 2006 à 09:54:31 | Re : Passage d'argument pour printf

platon179

Membre Club
Salut :)

Il te manque une instruction apres va_list listArg :

va_start(pa, psText);


Bonne journée @+

mardi 4 avril 2006 à 10:00:47 | Re : Passage d'argument pour printf

Quazar

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]

mardi 4 avril 2006 à 10:02:32 | Re : Passage d'argument pour printf

Quazar

'pa' par listArg, pardon...

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

mardi 4 avril 2006 à 10:58:29 | Re : Passage d'argument pour printf

Mr.X

Réponse acceptée !
#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;
}




mardi 4 avril 2006 à 11:11:44 | Re : Passage d'argument pour printf

Quazar

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]

mardi 4 avril 2006 à 11:18:15 | Re : Passage d'argument pour printf

magma

Réponse acceptée !






int myPrint(char *psText, ...)
{
    int     r;   
    va_list listArg;
    va_start(listArg, psText);
    r = vprintf(psText, listArg);
    va_end(listArg);
    return r;
}


mardi 4 avril 2006 à 11:23:21 | Re : Passage d'argument pour printf

Quazar

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]

mardi 4 avril 2006 à 11:53:52 | Re : Passage d'argument pour printf

meech

Membre Club

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.


mardi 4 avril 2006 à 12:02:32 | Re : Passage d'argument pour printf

Quazar

Merci encore mais  je suis deja sous Windows, cependant ce morceau de code est interessant ;)

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


1 2

Cette discussion est classé dans : int, passage, printf, include, argument


Répondre à ce message

Sujets en rapport avec ce message

Probleme reception sur un serveur windows en vc++ [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi, toute mes socket sont positives le client envois Separer une chaine en sous chaine [ par firemax ] Bonjour Je me posais une question , j'aimerais diviser une chaine en sous chaine pour pouvoir ensuite les trier par longueur de chaine de caractere oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< URGENT: pb passage d'argument tableau de chaine de caracteres! [ par joduak ] Salut à vous! j'ai un problème de passage d'argument d'un tableau de chaine de caractere. Si quelqu'un à une idée, faire vite svp ! Voici mon code : affichage bizarre [ par darkwhite ] Salut a tousJe commence par faire une lotterie simple mais j'ai un probleme au niveau de l'affichage d'un tableau, mon code est le suivant#include #in Mon programme quitte tout seul [ par darkwhite ] Salut j'ai le code suivant tout con ;#include #include int main(int argc, char *argv[]){  int a,b;  printf("1er nombre:");  scanf("%d",&a);  printf("2 problème de if et else [ par ffnajia ] bonjour je comprend pas pourquoi le programme ci-dessous ne prend pas en compte l'éxistence de if et else!!!???#include#include using namespace std; Probleme de passage d'argument [ par dr971 ] Bonjour , j'ai un petit prob (plutot un gros)En fait j'ai une class A et une class BclassA{   public :        void setResistance(int);         //mutat Equation seconde degres [ par sliverman ] Bonsoir a tous, alors voila, ( je commence en éléctro des demain le C et le prof nous a dit se qu'on devra savoir faire au bout des 8h, c'est résoudre Suite de Fibonacci [ par BastienL21 ] Bonjour à tous, débutant en C, j'ai écris un code permettant d'éxecuter la suite de Fibonacci en additionnant les deux nombres précédant, stockés dans


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.