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 :

Remplacer un format dans une chaîne (printf)


Sujet :

C

  1. #1
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut Remplacer un format dans une chaîne (printf)
    Salut,

    J'écris une fonction qui se charge de remplacer à la manière de printf les symboles d'une chaîne formatée afin d'écrire la nouvelle chaîne dans un fichier texte. L'écriture n'est pas un problème mais j'ai du mal à remplacer les symboles.

    Voici ma fonction :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    int addLog(int logLevel, char *strLogFormat, ...)
    {
    	char buffer[BUFF_SIZE];
    	char strLog[BUFF_SIZE];
    	char *strLevel;
    	int i = 0;
    	int count = 0;
     
    	va_list ap;
    	va_start(ap, strLogFormat);
     
    	if (!fd)
    	{
    		openLog();
    	} else {
    		switch (logLevel)
    		{
    			case LOGINFO:
    				strLevel = "INFO";
    				break;
    			case LOGDEBUG:
    				strLevel = "DEBUG";
    				break;
    			case LOGWARNING:
    				strLevel = "WARNING";
    				break;
    			case LOGERROR:
    				strLevel = "ERROR";
    				break;
    			case LOGFATAL:
    				strLevel = "FATAL";
    				break;
    			case LOGNOTICE:
    			default:
    				strLevel = "NOTICE";
    				break;
    		}
     
    		do
    		{
    			if (strLogFormat[i] == '%')
    			{
    				switch (strLogFormat[i+1])
    				{
    					case 's':
    						sprintf(strLog, "%s%s", buffer, va_arg(ap, char *));
    						break;
    					case 'c':
    						sprintf(strLog, "%s%c", buffer, (char) va_arg(ap, int));
    						break;
    					case 'd':
    						sprintf(strLog, "%s%d", buffer, va_arg(ap, int));
    						break;
    					default:
    						break;
    				}
    				count = 0;
    				i++;
    			} else {
    				buffer[count] = strLogFormat[i];
    				count++;
    			}
    			i++;
    		} while (strLogFormat[i] != '\0');
    		va_end(ap);
     
    		fprintf(fd, "%s: %s\n", strLevel, strLog);
    	}
    	return 0;
    }
    Mais ça ne fonctionne pas très bien

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Mais ça ne fonctionne pas très bien
    -> Quel est précisément le souci ?
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Pourquoi ne pas utiliser vsprintf ? Elle sert justement à ca dans le cas d'une liste variable d'arguments !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsprintf (strLog, strLogFormat, ap);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut
    Ah oui désolé !

    J'appelle ma fonction donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addLog(LOGNOTICE, "Test %d %s", 1, "affichage");
    et l'affichage résultant :
    NOTICE: est affichage
    En mettant des printf un peu partout, j'ai remarqué que buffer contenait déjà "NOTICE: (null)" dès le début de la fonction pourtant à sa première utilisation.

  5. #5
    Membre actif

    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Franck.H
    Pourquoi ne pas utiliser vsprintf ? Elle sert justement à ca dans le cas d'une liste variable d'arguments !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vsprintf (strLog, strLogFormat, ap);
    Ah oui ! C'est drôlement plus simple comme ça... Merci !

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Si tu veux savoir pourquoi ton code ne marchait pas, c'est parce que tu écrasais ta variable strLog à chaque sprintf au lieu de concaténer au fur et à mesure tes résultats intermédiaires à strLog.

    Sinon, ce n'est pas la peine de réinventer la roue, donc oui vsprintf c'est très bien.

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

Discussions similaires

  1. Remplacer seulements certains ";" dans une chaîne
    Par Amaury_35 dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2009, 18h30
  2. Remplacer des motifs dans une chaîne
    Par tonguim dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2009, 17h49
  3. Réponses: 2
    Dernier message: 31/03/2008, 15h18
  4. Remplacer les accents dans une chaîne
    Par mathieumg dans le forum C
    Réponses: 9
    Dernier message: 23/07/2006, 15h39
  5. Comment remplacer plusieurs caractères dans une chaîne?
    Par Antigonos Ier Gonatas dans le forum Général Python
    Réponses: 5
    Dernier message: 16/06/2006, 16h04

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