sprinft a base de tableau - C - Programmation
Marsh Posté le 04-03-2008 à 11:56:54
__ sont des identifiants réservés. Tu ne dois pas les utiliser.
Marsh Posté le 04-03-2008 à 23:28:59
Merci pour le conseil, je le saurais pour la prochaine fois...
Mais je ne présentais la struct (que j'ai écris à la volée) que pour le principe, sachant que mon vrai problème, c'est de partir d'une liste de chaine (récupérée depuis les valeurs de la liste chainée) en utilisant un formattage à la sauce sprintf...
par exemple, un fichier de conf contenant
Code :
|
et un liste chainée du type (pseudo code)
Code :
|
par contre je ne vois pas trop comment faire pour passer de my_sprintf_array à (v)sprintf sans faire de parsing sioux du contenu de la chaine fmt lu dans la conf...
A moins que vous ayez une autre approche + simple...
J'espère que je suis assez clair
Marsh Posté le 05-03-2008 à 01:16:11
Bon bah finalement, j'ai fait un petit truc qui est finalement plus simple que prévu, et ça marche pas mal...
En fait je par le format en faisant :
- boucle sur les '%'
- je copie dans le buffer de sortie tout ce que j'ai "sauté" en faisant ma recherche du % suivant
- si le caractère suivant est % (donc je suis en train de traiter un %%) j'affiche %, j'avance et je boucle
- sinon je cherche le prochain "s" (assumption, le format est correct), et j'appelle sprinft dessus (certes un peu sioux en faisant un décalage sur le buf de la longueur courante de ce que j'ai déjà écris)
- j'avance d'un caractère (par rapport à la fin du format de string et je boucle
- en sortant de boucle je copie le résiduel s'il existe
- je checke que j'ai bien "consommé" tout mes paramètres sinon j'affiche un warning...
Voilà le code :
Code :
|
Voilà, si ça peut aider,intéresser d'autres,
Je suis preneur de remarques/autres idées...
Marsh Posté le 05-03-2008 à 11:49:40
je sais : c'est "caché" dans les commentaires (je voulais pas écrire tous les mallocs)...
Le code en question n'était qu'un exemple de ce que je voulais faire, ma vrai problématique étant la fonction my_sprintf_array, qui s'est avérée plus simple que prévue (en fait je me battais avec les strtok, alors que mon vrai besoin était la fonction strpbrk)...
Marsh Posté le 05-03-2008 à 11:57:04
strncmp((fmt_curr_p+1),"%",1) c'est une sacré façon de faire un ==
Dans tous les cas, croisons les doigts pour que buf soit assez grand.
Marsh Posté le 05-03-2008 à 12:16:23
ce sont les risques du métier en C : je voulais surtout faire un sprintf non basé sur un nombre de params variables, mais un tableau de valeur construit par l'appelant
Marsh Posté le 05-03-2008 à 12:18:50
dreameddeath a écrit : ce sont les risques du métier en C |
C'est pas parce que ton métier est risqué qu'il faut aller sur le chantier en slip-chaussettes.
Marsh Posté le 05-03-2008 à 18:37:26
Donc pour éviter le slip chaussette, j'ai modifié mon code pour checker la taille au fur et à mesure, j'en ai profité pour assouplir le passage de paramètre en pouvant passer 3 types (int, float et string) et des codes retours normalisés ...
Je pense (j'espère?) que c'est bon maintenant
Taz, je te laisse seul juge
Code :
|
J'espère n'avoir rien oublié cette fois ;p
Marsh Posté le 03-03-2008 à 21:55:57
Bonjour à tous,
je souhaiterais faire un petit module de generation de fichier configurable. En fait j'ai un structure de donnée de type liste chainée qui contient une structure de type (ce n'est pas le vrai code, car c'est une structure de donnée fournie par un progiciel qui est un type abstrait, mais c'est juste pour l'exemple.)
Structurellement les "name" sont uniques dans une liste donnée...
Ensuite je souhaite faire un génarateur de fichier configurable qui contient dans la conf :
- le format au format printf (avec des %s "toutes options", avec les -, padding à droite, etc...)
- la liste des paramètres (les "names" des maillons) pour remplacer les %s avec la valeur correspondante de maillons de chaine
- la taille max resultante (pour ne pas avoir à me faire chier avec des realloc)
Pour cela j'avais pensé à un moyen relativement générique de passer d'une fonction de type :
qui appellerait comme il faut (v)sprintf, mais je ne vois pas trop comment faire sans me taper un redécoupage de mon chaine de formattage : mais je ne vois pas comment faire pour passer de ce tableau de chaines à un va_list ou tout autres choses, et je suis à cours d'idées
Merci d'avance pour toute idée
Message édité par dreameddeath le 03-03-2008 à 22:23:36