Pregunta

¿Alguien puede indicarme un archivo de código fuente o un paquete que tenga una buena implementación reutilizable de sprintf () en C que pueda personalizar según mis propias necesidades?

Una explicación de por qué lo necesito: las cadenas no terminan en nulo en mi código (compatible con binarios). Por lo tanto, sprintf ("% s ") es inútil a menos que arregle el código para entender cómo representar la cadena.

Gracias a quinmars por señalar que hay forma de imprimir la cadena a través de% s sin que se termine con un valor nulo. Aunque resuelve el requisito en este momento, eventualmente necesitaré la implementación de sprintf (o snprintf) para las funciones de nivel superior que utilizan variantes. Fuera de lo mencionado hasta ahora, me parece que la implementación de SQLite es la mejor. Gracias Doug Currie por señalarlo.

¿Fue útil?

Solución

No lo he probado, porque no tengo un compilador aquí, pero al leer la página del manual, parece que puedes pasar una precisión para '% s':

  

... Si se da una precisión, ningún carácter nulo                necesita estar presente Si no se especifica la precisión, o si es mayor.                que el tamaño de la matriz, la matriz debe contener una terminación                NUL carácter.

¿Has intentado hacer algo así?

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

Como he dicho, no lo he probado, y si funciona, funciona, por supuesto, solo si no tienes un byte '\ 0' dentro de la cadena.

EDITAR: ¡Lo he probado ahora y funciona!

Otros consejos

Realmente deberías estar buscando snprintf (sprintf respetando el tamaño del búfer de salida); Google sugiere http://www.ijs.si/software/snprintf/ .

Hay una buena implementación de dominio público como parte de SQLite aquí .

Estoy de acuerdo con Dickon Reed en que quieres snprintf, que se incluye en la versión SQLite.

He usado este código fuente de los chicos. Es pequeño, comprensible y fácil de modificar (a diferencia de glib & amp; libc).

Según este enlace, http://www.programmingforums.org/thread12049.html:

  

Si tienes la distribución completa de gcc,   la fuente de la biblioteca C (glib o   libc) es uno de los subdirectorios.   Eso viene para el paseo.

Así que puedes buscarlo allí. No sé cuán útil será ...

La única razón que se me ocurre para querer modificar el sprintf es extenderlo, y la única razón para hacerlo es cuando estás en camino de escribir algún tipo de analizador.

Si está buscando crear un analizador para algo como un lenguaje de codificación, XML o realmente cualquier cosa con una sintaxis, le sugiero que busque en Lexers y analizadores de generadores (2 de los más utilizados son Flex y Bison ) que puede escribir el código extremadamente complejo para los analizadores (aunque las herramientas en sí son algo complejas).

De lo contrario, puede encontrar el código correspondiente en los archivos de origen que se incluyen con Visual Studio (al menos 2005 y 2008, otros pueden tenerlo, pero esos dos sí lo hacen).

snprintf from glibc es personalizable a través del mecanismo de enlace / manejador

Sólo una idea ... Ejemplo:

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