Frage

Kann mich jemand deuten auf eine Quellcodedatei oder zu einem Paket, das eine gute, wiederverwendbare Implementierung von sprintf () in C hat, die ich nach meinem eigenen Bedarf anpassen kann?

Eine Erklärung, warum ich es brauche: Strings sind nicht in meinem Code Nullterminiert (binär-kompatibel). Daher sprintf ( „% s“) ist nutzlos, wenn ich den Code beheben zu verstehen, wie Zeichenfolge zu machen.

Vielen Dank für den Hinweis auf quinmars, dass Art und Weise Schnur durch% s zu drucken, ohne sie zu null beendet werden. Obwohl es die requriement jetzt löst, werde ich brauche schließlich die sprintf (oder snprintf) -Implementierung für höhere Level-Funktionen, die Varianten verwenden. Aus anderen bis jetzt erwähnt, scheint es mir, dass SQLite Implementierung ist die beste. Dank Doug Currie es für den Hinweis auf.

War es hilfreich?

Lösung

Ich habe es nicht ausprobiert, weil ich hier nicht einen Compiler, aber die man-Seite zu lesen, sieht es so aus, dass Sie eine Präzision für ‚% s‘ passieren können:

  

... Wenn eine Genauigkeit angegeben, kein Nullzeichen                muß vorhanden sein; wenn die Genauigkeit nicht angegeben ist, oder größer                als die Größe des Arrays, muß das Array einen Abschluß enthält                NUL-Zeichen.

So haben Sie versucht, so etwas zu tun?

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

Wie gesagt ich habe es nicht testen, und wenn es funktioniert, es funktioniert natürlich nur, wenn Sie keinen ‚\ 0'-Byte innerhalb des Strings.

EDIT: Ich habe es jetzt getestet und es funktioniert

Andere Tipps

Sie sollten sich wirklich für snprintf suchen (sprintf Ausgabepuffergröße zu respektieren); Google schlägt vor, http://www.ijs.si/software/snprintf/ .

Es gibt eine schöne Public Domain Implementierung im Rahmen von SQLite hier .

Ich bin mit Dickon Reed, die Sie snprintf wollen, die in der SQLite-Version enthalten ist.

ich verwendet habe diese Jungs Quellcode. Es ist klein, verständlich und leicht zu ändern (im Gegensatz zu Glib & libc).

Nach diesem Link- http://www.programmingforums.org/thread12049.html:

  

Wenn Sie die volle gcc Verteilung haben,   die Quelle für die C-Bibliothek (glib oder   libc) ist eines der Unterverzeichnisse   das kommt für die Fahrt.

So können Sie es dort oben schauen. Ich weiß nicht, wie hilfreich das sein wird ...

Der einzige Grund, warum ich von zu wollen denken kann sprintf zu modifizieren ist, es zu verlängern, und der einzige Grund, warum es für die Verlängerung ist, wenn Sie auf Ihrem Weg eine Art Parser zu schreiben.

Wenn Sie schauen, um einen Parser für so etwas wie eine Codierung Sprache, XML oder wirklich etwas mit einer Syntax zu erstellen, empfehle ich Ihnen Einblick in Lexer und Parser-Generatoren (2 der am häufigsten verwendeten sind Flex und Bison ), die so ziemlich die äußerst komplexen Code für Parser für Sie schreiben (obwohl die Werkzeuge selbst etwas komplex sind).

Sie können den Code für sie in den Quelldateien finden, die mit Visual Studio enthalten sind (zumindest 2005 und 2008, andere könnten es haben, aber die 2 auf jeden Fall tun).

snprintf von glibc ist anpassbar über Haken / Handler-Mechanismus

Nur eine Idee ... Beispiel:

#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;
}

Schauen Sie sich Hanson C Schnittstellen: Implementations und Techniken . Es ist ein interessantes Buch, dass geschrieben steht mit Knuths Literate Programming Techniken, und es schließt insbesondere eine erweiterbares Format I / O-Schnittstelle basierend auf snprintf().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top