6
votes

C, traitant de fonctions d'argumentation variable

Disons que je veux faire quelque chose comme ça xxx

Quelle est la manière appropriée de transmettre le nombre variable d'arguments directement à une fonction permet d'accepter des arguments variables?


2 commentaires

Comment allez-vous savoir que le tampon est assez grand? Et vous devriez vraiment retourner le nombre de conversions effectuées par Sprintf (), sinon les utilisateurs n'ont aucun moyen de connaître la fonction fonctionnée.


J'ai rayé tout ce qui n'était pas essentiel pour illustrer mon point. Évidemment dans mon code de libération, je suis beaucoup plus complet :)


3 Réponses :


9
votes

sprintf a un fichier va_list appelé vsprintf . Passez le va_list Vous construisez localement à cela comme dernier argument. xxx


2 commentaires

L'en-tête opératoire est .


Si c'est disponible, vous devez utiliser vsnprintf .



1
votes

Je ne sais pas à quel point ce code sera utile, car il s'agit de C ++, mais il montre comment vérifier, à l'aide d'une fonction spécifique Win32 VSNPRINTF (), que le tampon alloué est suffisamment grand et si cela ne va pas d'allouer un plus grand . Et il renvoie une ficelle STD :: String, vous devez donc utiliser Malloc / Realloc pour gérer cela. Mais qu'est-ce que diable: xxx


0 commentaires

-1
votes

Vous pouvez nous utiliser les fonctions de style VSPrintf pour obtenir l'impression de style PrintF pour votre paramètre de longueur variable. Cependant, il n'y a pas de requillage pour le faire. Si vous choisissez, vous pouvez écrire votre fonction pour continuer à accepter les paramètres jusqu'à ce qu'il rencontre un pointeur NULL.

void my_printf(int param_num,...)
{
 va_list ap;
char *param;
va_start(ap,fmt);
while(param_num)
{
do something...
param = va_arg(ap,char*);
param_num--;
}

}


2 commentaires

obliger l'utilisateur à spécifier le nombre de paramètres serait une catastrophe de conception


Mon point est le ... N'est-ce pas pigeon sur une certaine utilisation. L'utilisateur de la fonction peut décider de ce qui est préférable pour leur situation. En passant dans le nombre de paramètres n'est pas différent du nombre d'un nombre imbécile dans une chaîne ... c'est-à-dire sprintf ("% d% d", A, B) est la même chose que votreprintf (2, A, B), Sprintf est Tout comme sujette à l'erreur utilisateur.