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 :

Taille d'une chaîne formatée


Sujet :

C

  1. #1
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut Taille d'une chaîne formatée
    Bonjour,

    Je suis fasse à un petit problème.

    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
     
    int sendSock(int sock, char *buf, ...)
    {
    	char buff[MAX_IO+1];
     
    	int len, t_bytes = 0, r_bytes, n;
     
    	memset(buff, '\0', MAX_IO+1);
     
    	va_list val;
     
    	va_start(val, buf);
    	vsnprintf(buff, MAX_IO - 2, buf, val);
    	va_end(val);	
     
    	len = strlen(buff);
    	r_bytes = len;
     
    	while(t_bytes < len) {
    		n = send(sock, buff+t_bytes, r_bytes, 0);
    		if (n == -1) {
    			break; 
    		}
    		t_bytes += n;
    		r_bytes -= n;
    	}
     
    	len = t_bytes;
     
    	return (n==-1 ? -1: 0);
    }
    J'alloue statiquement la taille (MAX_IO) de mon buffer qui va accueillir ma chaîne formatée.

    Est il possible de connaître à l'avance la taille pour pouvoir allouer dynamiquement mon buffer ?

    Merci

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Le seul moyen est d'appeler 2 fois vsnprintf()

    1 - La première fois tu lui passes NULL pour le paramêtre 'str', la taille nécessaire pour stocker la chaine formatées est alors retournée

    2 - Tu alloues le buffer

    3 - Et ensuite tu le passes à vsnprintf() pour formater la chaine.

    Exemple, avec ton code et tes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        len  = vsnprintf(NULL, 0, buf, val);
        buff = malloc(len + 1);
     
        if (buff == NULL)
        {
            /* ... */
        }
     
        vsnprintf(buff, len + 1, buf, val);
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/10/2014, 17h15
  2. Taille d'une chaîne de caractères
    Par walidos11 dans le forum Assembleur
    Réponses: 1
    Dernier message: 10/11/2010, 12h09
  3. La taille d'une chaîne de caractères
    Par looking_4truth dans le forum Débuter
    Réponses: 4
    Dernier message: 09/08/2010, 15h32
  4. Créer dynamiquement une chaîne formatée
    Par Haze. dans le forum C
    Réponses: 12
    Dernier message: 28/12/2007, 03h19

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