Mirne OFFTOPIC: Prevod snprintf na sprintf

Martin Spirk spirk na kla.pvt.cz
Pondělí Duben 17 11:18:53 CEST 2000


Dne So, 15 duben 2000 jste napsal(a):
>Vazeni kolegove,
>
>     mam unixovy system, jehoz C knihovna ani stdio.h neumi funkci
>snprintf a balik, ktery pouziva stovky jejich volani. Napadlo mne
>zkusit ji prevest na sprintf:
>
>snprintf(vyst_retez, delka, format, parametry, ....)  na
>sprintf(vyst_retez, format, parametry, ....) .
>
>    Netusil by nekdo jak prevodni snprintf napsat - se zohlednenim
>neurciteho poctu parametru?

Co se tyka neurciteho poctu parametru tak asi takhle:

#include <stdarg.h>

int snprintf(char *vyst_retez, int delka, const char *format,...)
{
va_list ap;
va_start(ap,format);
vsprintf(vyst_retez,format,ap);
va_end(ap);
return(strlen(vyst_retez));
}

Ovsem s nejvetsi pravdepodobnosti nekdy dojde k nejakemu preteceni bufferu a
nebude to fungovat. Trochu vetsi nadeji na funkcnost by melo udelat si nejaky
vlastni hooodne velky buffer a zpracovat to pres nej.

int snprintf(char *vyst_retez, int delka, const char *format,...)
{
#define BUF_SIZE 2000000
static char buf[BUF_SIZE];
int d;
va_list ap;
va_start(ap,format);
vsprintf(buf,format,ap);
va_end(ap);
d=strlen(buf);
if(d>=BUF_SIZE){
  fprintf(stderr,"Maly buffer pro snprintf, program bude ukoncen !");
  exit(1);
  }
if(d<delka)
  strcpy(vyst_retez,buf);
return(d);
}

A kdyz to nebude fungovat tak ten buffer zvetsit atd. atd....
Nejjistejsi ovsem bude podivat se do zdrojaku glibc.

				Martin


Další informace o konferenci Linux