Question

Quelqu'un peut-il m'indiquer un fichier de code source ou un package doté d'une bonne implémentation réutilisable de sprintf () en C que je peux personnaliser en fonction de mes besoins?

Une explication de la raison pour laquelle j'en ai besoin: les chaînes ne sont pas terminées par zéro dans mon code (compatible binaire). Par conséquent, sprintf ("% s") est inutile sauf si je corrige le code pour comprendre comment rendre une chaîne.

Merci à quinmars d’avoir fait remarquer qu’il est possible d’imprimer une chaîne de caractères à travers% s sans que celle-ci soit terminée par une valeur nulle. Même si cela résout le problème actuellement, j’aurai besoin de l’implémentation sprintf (ou snprintf) pour les fonctions de niveau supérieur qui utilisent des variantes. Parmi les autres projets cités jusqu'à présent, il me semble que l'implémentation de SQLite est la meilleure. Merci, Doug Currie, de l'avoir signalé.

Était-ce utile?

La solution

Je ne l'ai pas essayé, car je n'ai pas de compilateur ici, mais en lisant la page de manuel, vous pouvez passer une précision pour '% s':

  

... Si une précision est donnée, aucun caractère null                besoin d'être présent; si la précision n'est pas spécifiée ou est supérieure                que la taille du tableau, le tableau doit contenir une terminaison                Caractère NUL.

Alors avez-vous essayé de faire quelque chose comme ça?

snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);

Comme je l’ai dit, je ne l’ai pas testé et, si cela fonctionne, cela ne fonctionne bien sûr que si vous n’avez pas d’octet '\ 0' à l’intérieur de la chaîne.

EDIT: je l'ai testé et cela fonctionne!

Autres conseils

Vous devriez vraiment chercher snprintf (sprintf respectant la taille du tampon de sortie); google suggère de http://www.ijs.si/software/snprintf/ .

Il existe une belle implémentation de domaine public dans SQLite ici .

Je suis d'accord avec Dickon Reed sur le fait que vous souhaitez utiliser snprintf, qui est inclus dans la version SQLite.

J'ai utilisé le code de ce type. Il est petit, compréhensible et facile à modifier (contrairement à Glib & libc).

Selon ce lien - http://www.programmingforums.org/thread12049.html:

  

Si vous avez la distribution complète de gcc,   la source de la bibliothèque C (glib ou   libc) est l'un des sous-répertoires   qui vient pour le trajet.

Vous pouvez donc regarder là-haut. Je ne sais pas à quel point cela sera utile ...

La seule raison pour laquelle je peux penser à vouloir modifier sprintf est de l'étendre, et la seule raison de l'étendre est lorsque vous êtes sur le point d'écrire une sorte d'analyseur.

Si vous souhaitez créer un analyseur syntaxique pour un langage de codage, XML ou une syntaxe quelconque, je vous suggère d’examiner Lexers et les générateurs d’analyseurs (les 2 les plus utilisés sont Flex et Bison ) qui peut écrire le code extrêmement complexe des analyseurs syntaxiques pour vous (bien que les outils eux-mêmes soient quelque peu complexes).

Sinon, vous pouvez trouver le code correspondant dans les fichiers source fournis avec Visual Studio (au moins 2005 et 2008, d'autres l'ont peut-être, mais ces 2 le sont certainement).

snprintf de la glibc est personnalisable via un mécanisme de raccordement / traitement

Juste une idée ... Exemple:

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

int sprintf(char * str, const char * format, ... )    
{// Here you can redfine your input before continuing to compy with standard inputs
    va_list args;
    va_start(args, format);
    vsprintf(str,format, args);// This still uses standaes formating
    va_end(args);
    return 0;// Before return you can redefine it back if you want...
}
int main (void)
{
    char h[20];
    sprintf(h,"hei %d ",10);
    printf("t %s\n",h);
    getchar();
    return 0;
}

Consultez les interfaces C: implémentations et techniques de Hanson. C'est un livre intéressant en ce sens qu'il est écrit en utilisant les techniques de Programmation alphabète de Knuth, et il inclut spécifiquement une interface d'E / S formatée extensible basée sur snprintf () .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top