Настраиваемая реализация sprintf()

Может ли кто-нибудь указать мне файл исходного кода или пакет, в котором есть хорошая многоразовая реализация sprintf() в C, которую я могу настроить в соответствии со своими потребностями?

Объяснение, зачем мне это нужно: в моем коде строки не заканчиваются нулем (совместимы с двоичным кодом). Поэтому sprintf("%s") бесполезен, если я не исправлю код, чтобы понять, как отображать строку.

Спасибо quinmars за указание на то, что есть способ напечатать строку через %s, не завершая ее нулем. Хотя это решает задачу прямо сейчас, мне в конечном итоге понадобится реализация sprintf (или snprintf) для функций более высокого уровня, которые используют варианты. Из всего, что было упомянуто до сих пор, мне кажется, что реализация SQLite является лучшей. Спасибо Дугу Карри за указание на это.


person CDR    schedule 04.03.2009    source источник
comment
Не могли бы вы объяснить, что вы хотите изменить в sprintf()? Это вызывает у меня тревогу, потому что кажется, что есть решение получше, чем дублирование сложной функции API.   -  person Thorsten79    schedule 04.03.2009


Ответы (9)


Я не пробовал, потому что у меня нет здесь компилятора, но, читая справочную страницу, похоже, что вы можете передать точность для '%s':

... Если задана точность, нулевой символ не требуется; если точность не указана или превышает размер массива, массив должен содержать завершающий символ NUL.

Так вы пытались сделать что-то подобное?

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

Как я уже сказал, я не проверял это, и если это работает, то работает, конечно, только в том случае, если у вас нет байта '\ 0' внутри строки.

РЕДАКТИРОВАТЬ: я проверил это сейчас, и это работает!

person quinmars    schedule 04.03.2009
comment
Именно то, что я смотрел. - person plinth; 04.03.2009

Вам действительно следует искать snprintf (sprintf с учетом размера выходного буфера); Google предлагает http://www.ijs.si/software/snprintf/.

person Dickon Reed    schedule 04.03.2009


Я использовал исходный код этого. Он небольшой, понятный и легко модифицируемый (в отличие от glib и libc).

person Gerhard    schedule 05.03.2009

По этой ссылке - http://www.programmingforums.org/thread12049.html:

Если у вас есть полный дистрибутив gcc, исходный код библиотеки C (glib или libc) является одним из подкаталогов, которые вы можете взять с собой.

Так что можете поискать там. Не знаю, насколько это будет полезно...

person batbrat    schedule 04.03.2009

Единственная причина, по которой я могу придумать модификацию sprintf, — это его расширение, а единственная причина для его расширения — когда вы собираетесь написать какой-то синтаксический анализатор.

Если вы хотите создать синтаксический анализатор для чего-то вроде языка кодирования, XML или чего-то еще с синтаксисом, я предлагаю вам изучить лексеры и генераторы синтаксических анализаторов (двумя наиболее часто используемыми из них являются Flex и Bison), который может в значительной степени написать чрезвычайно сложный код для парсеров (хотя сами инструменты несколько сложны).

В противном случае вы можете найти код для него в исходных файлах, которые включены в Visual Studio (по крайней мере, 2005 и 2008, у других он может быть, но у этих 2 точно есть).

person Grant Peters    schedule 04.03.2009

snprintf из glibc настраивается с помощью механизма хука/обработчика

person vitaly.v.ch    schedule 04.03.2009

Просто идея... Пример:

#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;
}
person eaanon01    schedule 07.03.2009

Взгляните на интерфейсы C: реализации и методы Хэнсона. Это интересная книга тем, что она написана с использованием грамотного программирования. и, в частности, включает расширяемый форматированный интерфейс ввода-вывода на основе snprintf().

person Jonathan Leffler    schedule 04.03.2009
comment
Это хорошая книга, но она использует sprintf под капотом, чтобы делать тяжелую работу. - person Eli Bendersky; 20.10.2010