Вопрос

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

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

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

Это было полезно?

Решение

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

  

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

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

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

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

РЕДАКТИРОВАТЬ: я уже тестировал его, и он работает!

Другие советы

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

В SQLite есть отличная реализация, являющаяся частью общедоступного домена. здесь .

Я согласен с Диконом Ридом в том, что вам нужен snprintf, включенный в версию SQLite.

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

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

  

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

Так что вы можете посмотреть это там. Я не знаю, насколько это будет полезно ...

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top