Domanda

Qualcuno può indicarmi un file di codice sorgente o un pacchetto che ha un'implementazione buona e riutilizzabile di sprintf () in C che posso personalizzare secondo le mie necessità?

Una spiegazione del perché ne ho bisogno: le stringhe non sono nulle nel mio codice (binario compatibile). Pertanto sprintf ("% s ") è inutile se non aggiusto il codice per capire come rendere la stringa.

Grazie a quinmars per aver sottolineato che esiste un modo per stampare la stringa attraverso% s senza che sia terminata con null. Sebbene risolva il requisito in questo momento, alla fine avrò bisogno dell'implementazione di sprintf (o snprintf) per funzioni di livello superiore che usano varianti. Tra gli altri citati finora, mi sembra che l'implementazione di SQLite sia la migliore. Grazie Doug Currie per averlo segnalato.

È stato utile?

Soluzione

Non l'ho provato, perché non ho un compilatore qui, ma leggendo la pagina man sembra che tu possa passare una precisione per '% s':

  

... Se viene fornita una precisione, nessun carattere null                deve essere presente; se la precisione non è specificata o è maggiore                rispetto alle dimensioni dell'array, l'array deve contenere una terminazione                Carattere NUL.

Quindi hai provato a fare qualcosa del genere?

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

Come ho detto, non l'ho testato e, se funziona, funziona ovviamente solo se non ci sono byte "\ 0" all'interno della stringa.

EDIT: l'ho provato ora e funziona!

Altri suggerimenti

Dovresti davvero cercare snprintf (sprintf rispettando le dimensioni del buffer di output); google suggerisce http://www.ijs.si/software/snprintf/ .

Esiste una buona implementazione di dominio pubblico come parte di SQLite qui .

Sono d'accordo con Dickon Reed che desideri snprintf, che è incluso nella versione di SQLite.

Ho usato questo codice sorgente per ragazzi. È piccolo, comprensibile e facile da modificare (al contrario di glib & amp; libc).

Secondo questo link- http://www.programmingforums.org/thread12049.html:

  

Se hai la distribuzione completa di gcc,   la fonte per la libreria C (glib o   libc) è una delle sottodirectory   quello viene per il giro.

Quindi puoi guardarlo lassù. Non so quanto sarà utile ...

L'unica ragione che mi viene in mente per voler modificare sprintf è estenderla, e l'unica ragione per estenderla è quando sei sulla buona strada per scrivere una sorta di parser.

Se stai cercando di creare un parser per qualcosa come un linguaggio di programmazione, XML o qualsiasi cosa con una sintassi, ti suggerisco di esaminare Lexers e Parser Generators (2 dei più usati sono Flex e Bison ) che può praticamente scrivere il codice estremamente complesso per i parser per te (anche se gli strumenti stessi sono in qualche modo complessi).

Altrimenti, puoi trovare il codice per esso nei file sorgente che sono inclusi in Visual Studio (almeno nel 2005 e nel 2008, altri potrebbero averlo, ma quei 2 sicuramente lo fanno).

snprintf di glibc è personalizzabile tramite il meccanismo hook / handler

Solo un'idea ... Esempio:

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

Guarda le Interfacce C: implementazioni e tecniche di Hanson . È un libro interessante in quanto è scritto usando le tecniche di programmazione letterale di Knuth, e include specificamente un'interfaccia I / O formattata estensibile basata su snprintf () .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top