IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction printf personnalisee


Sujet :

C

  1. #1
    Bob
    Bob est déconnecté
    Membre expérimenté
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut Fonction printf personnalisee
    Voila le pb, je voudrais faire une fonction printf personnalisee. En fait je voudrais utiliser la fonction printf existante mais retraiter la chaine renvoyee par printf. Les raisons pour lesquelles j'ai besoin de cette fonction sont longues a expliquer...
    Cette methode marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    int __cdecl myprintf(char *buf,char *chaine,...)
    {
    	va_list pa;
     
    	int i,nargs,arg,re;
    	nargs=0;
    	i=0;
    	do
    	{
    		if(chaine[i]=='%')
    		{
    			++i;
    			if(chaine[i]!='%')
    				++nargs;
    			else
    			{
    				if(chaine[i]==0)
    					break;
    				++i;
    			}
    		}
    		else
    			++i;
    	}while(chaine[i]!=0);
     
    	DWORD *args;
    	args=new DWORD[nargs];
     
    	va_start(pa,chaine);
    	for(i=0;i<nargs;++i)
    	{
    		args[i]=va_arg(pa,DWORD);
    	}
    	va_end(pa);
     
    	for(i=nargs-1;i>=0;--i)
    	{
    		arg=args[i];
    		__asm { push arg };
    	}
     
    	re=sprintf(buf,chaine);
     
    	for(i=0;i<nargs;++i)
    		__asm { pop eax };
     
    	return re;
    }
    Cependant il y a une perte de temps du fait que je suis oblige de depiler puis de rempiler en odre inverse les arguments qui sont passes a ma fonction. Y a-t-il moyen d'eviter cela ???

  2. #2
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 379
    Billets dans le blog
    1
    Par défaut
    Si c'est pour retraiter la sortie d'un printf, pourquoi ne pas utiliser vsprintf plutôt ? Et retraiter la chaîne obtenue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void my_printf(const char* format, ...)
    {
      va_list v;
      char buf[500]; /* c'est mal, à changer :p */
     
      va_start(v, format);
      vsprintf(buf, format, v);
      va_end(v);
     
      /* retravailler buf */
    }

  3. #3
    Bob
    Bob est déconnecté
    Membre expérimenté
    Avatar de Bob
    Inscrit en
    Mars 2002
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 115
    Par défaut
    Je ne connaissais pas cette fonction.
    Ca resout le pb.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier la fonction printf de bcb
    Par yozart dans le forum C++Builder
    Réponses: 0
    Dernier message: 24/10/2008, 11h45
  2. la fonction printf démystifiée
    Par saad.hessane dans le forum C
    Réponses: 22
    Dernier message: 10/07/2008, 14h22
  3. [MASM32] Comment utiliser la fonction printf
    Par _Michel dans le forum x86 32-bits / 64-bits
    Réponses: 26
    Dernier message: 08/11/2007, 11h09
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo