Настраиваемая реализация sprintf () - PullRequest
3 голосов
/ 04 марта 2009

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

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

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

Ответы [ 9 ]

5 голосов
/ 04 марта 2009

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

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

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

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

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

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

3 голосов
/ 04 марта 2009

Есть хорошая реализация общественного достояния как часть SQLite здесь .

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

3 голосов
/ 04 марта 2009

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

2 голосов
/ 05 марта 2009

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

1 голос
/ 07 марта 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;
}
1 голос
/ 04 марта 2009

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

1 голос
/ 04 марта 2009

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

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

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

1 голос
/ 04 марта 2009

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

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

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

0 голосов
/ 04 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...