Pergunta

Pode alguém me aponte para um arquivo de código-fonte ou a um pacote que tem uma boa, implementação reutilizável de sprintf () em C que eu posso personalizar como por minha própria necessidade?

Uma explicação sobre o porquê de eu precisar dele: Cordas não estão nulos encerrado no meu código (binário compatível). Portanto sprintf ( "% s") é inútil a menos que eu corrigir o código para entender como renderizar string.

Graças à quinmars por apontar que não há maneira de imprimir corda através% s sem que seja um terminador nulo. Embora ele resolve o requriement agora, vou eventualmente precisar a implementação sprintf (ou snprintf) para funções de nível superior que uso variantes. Dentre outras mencionado até agora, parece-me que a implementação SQLite é o melhor. Graças Doug Currie para apontar isso.

Foi útil?

Solução

Eu não tentei isso, porque eu não tenho um compilador aqui, mas lendo a página de manual, parece que você pode passar uma precisão para '% s':

... Se a precisão é dada, nenhum caractere nulo necessita de estar presente; se a precisão não for especificado, ou é maior do que o tamanho da matriz, a matriz tem de conter uma terminação caractere NUL.

Então, você já tentou fazer algo assim?

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

Como disse eu não testá-lo, e se ele funciona, funciona, naturalmente, apenas se você não tem '\ 0'-byte dentro da cadeia.

EDIT: Eu testei-o agora e ele funciona

Outras dicas

Você realmente deve estar procurando snprintf (sprintf respeitando saída tamanho do buffer); Google sugere http://www.ijs.si/software/snprintf/ .

Há um agradável implementação de domínio público como parte de SQLite aqui .

Eu concordo com Dickon Reed que você quer snprintf, que está incluído na versão SQLite.

Eu tenho usado este código-fonte caras . É pequeno, compreensível e fácil de modificar (em oposição a glib & libc).

De acordo com esta link- http://www.programmingforums.org/thread12049.html:

Se você tem a distribuição gcc completo, a fonte para a biblioteca C (glib ou libc) é um dos subdirectórios que vem para o passeio.

Assim, você pode procurá-lo lá. Eu não sei o quão útil que será ...

A única razão que eu posso pensar para querer modificar sprintf é estendê-la, ea única razão para estendê-lo é quando você está no seu caminho para escrever algum tipo de analisador.

Se você estiver olhando para criar um analisador para algo como uma linguagem de codificação, XML, ou realmente qualquer coisa com uma sintaxe, eu sugiro que você olhar para lexers e Parser Geradores (2 dos mais comumente utilizados são Flex e Bison ), que pode muito bem escrever o código extremamente complexo para analisadores para você (embora eles próprios as ferramentas são um pouco complexa).

Caso contrário, você pode encontrar o código para ele nos arquivos de origem que estão incluídos no Visual Studio (pelo menos 2005 e 2008, outros podem tê-lo, mas os dois certamente fazer).

snprintf da glibc é personalizável através de mecanismo de gancho / manipulador

Apenas uma idéia ... Exemplo:

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

Olhe do Hanson C Interfaces: Implementações e Técnicas . É um livro interessante na medida em que é escrito usando técnicas de Programação Alfabetizado de Knuth , e inclui especificamente um extensible formatado I / o interface baseada em snprintf().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top