Je cherche à construire un buffeur pour une requete SQL et je ne connais pas le nombre d'arguments que je doit passer.
EXEMPLE, SI j'ai un nombre d'argument fixe, je fait :
char param1[12], param2[12];
char *format="UPDATE t_table set col1='%s', col2='%s'";
......
sprintf(buff,format,param1,param2);
Mais dans le cas present je ne sait pas quelles colonnes seront mise a jour,
Je construis ma chaine "UPDATE .." par concatenation avec les colonnes necessaires;
char format[100]="UPDATE t_table set "; int i=0;
char *param[8];
if( bon1 ){ strcat( fromat," col1='%s',"); param[i++]=param1;}
if( bon2 ){ strcat( fromat," col2='%s',"); param[i++]=param2;}
*param[i]=NULL; /* avec ou sans ça meme resultat */
..
/* et je voudrais faire un truc comme ça */
vsprintf( buff,format,param);
ET ça sa ne marche pas (Memory fault) vsprintf veut un va_list pour troisième argument.
Mon problème est donc de donner un tableau à "v/sprintf" plutot qu'une liste en troisieme argument.
Si je mets *param[i++]=NULL; au début , pas de Memory fault mais rien à la place des %s.
Si je mets
va_start(ap, param[0]); /*ou va_start(ap, param); */
J'ai erreur à la compilation : "symbole non defini : ... "
je crois que les "..." correspondent aux ... donnés en 2eme parametre à une fonction dont le nombre d'arguments est variable.
(ap est bien declaré en va_list)
REM sur un autre forum on m'a donner une solution pour Windows, et ils sont tres heureux de prétendent pour faire ça sous Windows et que c'est impossible sous Linux .........
@+
# Re: tableau comme argument à vsprintf
Posté par pierthi . Évalué à 3.
[^] # Re: tableau comme argument à vsprintf
Posté par gaaaaaAab . Évalué à 1.
notamment : http://c-faq.com/varargs/invvarargs.html
# Veni, Vidi, et pas compris ;)
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 2.
# Petite précision pour Benoit
Posté par SteffaneL . Évalué à 1.
(Pour ta fonction il faudrait revoir les accolades ouvrantes et fermantes car les if{..}while(..); et les do{..}va_end(ap); meme avec un niveau débutant ça fait bizarre.)
Pour "Ce genre de connerie est quand meme plus simple a faire en utilisant un langage adapté : Perl " d'accord à 200% mais j'ai ordre de le faire en C, malheureusement pour moi.
Pour le forum pro windows : http://www.developpez.net/forums/showthread.php?t=184360
@+
[^] # Re: Petite précision pour Benoit
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 2.
La solution que ta donné Médinoc fonctionne sous linux/x86 elle aussi} while (nom_col); } while (nom_col); va_end (ap);
Mais je te déconseille fortement cette methode parce que ce n'est absolument pas portable. Contrairement à ce que semble penser cet "Expert confirmé Senior" les valist sont dépendantes de la plateforme matérielle et non de la plateforme logicielle. Typiquement ce code fonctionne sur x86 mais à peu de chance de fonctionner sur powerpc par exemple ou plus betement sur Itanium ou en mode x86-64. Mon conseil: Utilise des appels a snprintf dans une boucle ou autre structure de controle ce sera bcp plus propre. Exemple en reprenant ton code, transforme:
# Dernier
Posté par SteffaneL . Évalué à 1.
if( bon1 ){ strcat( fromat," col1='%s',"); param[i++]=param1;}
if( bon2 ){ strcat( fromat," col2='%s',"); param[i++]=param2;}
param[i]=NULL;
vsprintf( buff,format,(va_list) param);
dans mon cas je n'ai que des strings c'est plus simple sinon je pense qu'il faudrait utiliser va_arg ?
@+
[^] # Re: .
Posté par pierthi . Évalué à 2.
- Ta conversion de param en va_list n'est pas du tout portable, j'espère que tu n'auras pas à le tester sur d'autres archie. Sympa pour ceux qui vont maintenir ça après ...
- Utilise au moins vsnprintf, ça coute pas beaucoup plus cher, et tu éviteras un petit buffer overflow (surtout avec une taille de 100 octets). J'espère qu'il n'est pas trop critique ce code (pas d'accès public).
- Tes paramètres passés directement à sprintf, j'espère que tu es sûr de leur contenu, parce que c'est du pain bénit pour l'injection SQL, bref une faille de sécurité monumentale. Clairement, il ne vaut mieux pas qu'il soit public ton code.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.