La construction à la main d'un type va_list n'est pas du tout portable. Forcément sous Windows ça limite les choix, mais je parirai que le code qu'ils t'ont filé doit être hyper casse gueule. À ta place je reverrais légèrement ton "algo" :
#define MAX 1024
char buffer[MAX];
int usage = 0;
usage = sprintf(buffer, "%s", "UPDATE t_table set ");
if (bon1)
{
// Hum, hum, fait gaffe à l'SQL injection hein ....
usage += snprintf(buffer + usage, MAX - usage, " col1='%s',", param1);
}
if (bon2)
{
// Idem ici
usage += snprintf(buffer + usage, MAX - usage, " col2='%s',", param2);
}
/* .... */
C'est un poil plus complexe, parce qu'il y a vérification des débordements, mais si tu n'en a rien à foutre, tu pourras grandement simplifier le code ...
Sinon, je ne sais pas quel SGBD tu utilises, main en général dans l'API d'accès à la base, il y a des fonctions toutes prêtes pour gérer beaucoup plus proprement ce genre de problèmes (PostgreSQL et SQLite au moins).
# Re: tableau comme argument à vsprintf
Posté par pierthi . En réponse au message tableau comme argument à vsprintf. Évalué à 3.
#define MAX 1024 char buffer[MAX]; int usage = 0; usage = sprintf(buffer, "%s", "UPDATE t_table set "); if (bon1) { // Hum, hum, fait gaffe à l'SQL injection hein .... usage += snprintf(buffer + usage, MAX - usage, " col1='%s',", param1); } if (bon2) { // Idem ici usage += snprintf(buffer + usage, MAX - usage, " col2='%s',", param2); } /* .... */C'est un poil plus complexe, parce qu'il y a vérification des débordements, mais si tu n'en a rien à foutre, tu pourras grandement simplifier le code ... Sinon, je ne sais pas quel SGBD tu utilises, main en général dans l'API d'accès à la base, il y a des fonctions toutes prêtes pour gérer beaucoup plus proprement ce genre de problèmes (PostgreSQL et SQLite au moins).