Disons que je veux faire quelque chose comme ça Quelle est la manière appropriée de transmettre le nombre variable d'arguments directement à une fonction permet d'accepter des arguments variables? P> p>
3 Réponses :
sprintf code> a un fichier
va_list code> appelé
vsprintf code>. Passez le
va_list code> Vous construisez localement à cela comme dernier argument.
L'en-tête opératoire est
Si c'est disponible, vous devez utiliser vsnprintf code>.
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:
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--; } }
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.
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 :)