⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snprintf.c

📁 站点映像程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  }  if (p->precision != 0 || p->square == FOUND)    PUT_CHAR('.', p);  /* the '.' */  if (*p->pf == 'g' || *p->pf == 'G') /* smash the trailing zeros */    for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)       tmp2[i] = '\0';   for (; *tmp2; tmp2++)    PUT_CHAR(*tmp2, p); /* the fraction */  if (*p->pf == 'g' || *p->pf == 'e') { /* the exponent put the 'e|E' */     PUT_CHAR('e', p);   } else     PUT_CHAR('E', p);   if (j > 0) {  /* the sign of the exp */     PUT_CHAR('+', p);   } else {     PUT_CHAR('-', p);     j = -j;   }   tmp = itoa((double)j);   if (j < 9) {  /* need to pad the exponent with 0 '000' */     PUT_CHAR('0', p); PUT_CHAR('0', p);   } else if (j < 99)     PUT_CHAR('0', p);   while (*tmp) { /* the exponent */     PUT_CHAR(*tmp, p);     tmp++;   }   PAD_LEFT(p);}/* initialize the conversion specifiers */PRIVATE void#ifdef __STDC__conv_flag(char * s, struct DATA * p)#elseconv_flag(s, p)char * s;struct DATA * p;#endif{  char number[MAX_FIELD/2];  int i;  p->precision = p->width = NOT_FOUND;  p->star_w = p->star_p = NOT_FOUND;  p->square = p->space = NOT_FOUND;  p->a_long = p->justify = NOT_FOUND;  p->pad = ' ';  for(;s && *s ;s++) {    switch(*s) {      case ' ': p->space = FOUND; break;      case '#': p->square = FOUND; break;      case '*': if (p->width == NOT_FOUND)                  p->width = p->star_w = FOUND;                else                  p->precision = p->star_p = FOUND;                break;      case '+': p->justify = RIGHT; break;      case '-': p->justify = LEFT; break;      case '.': if (p->width == NOT_FOUND)                  p->width = 0;                break;      case '0': p->pad = '0'; break;      case '1': case '2': case '3':      case '4': case '5': case '6':      case '7': case '8': case '9':     /* gob all the digits */        for (i = 0; isdigit(*s); i++, s++)           if (i < MAX_FIELD/2 - 1)            number[i] = *s;        number[i] = '\0';        if (p->width == NOT_FOUND)          p->width = atoi(number);        else          p->precision = atoi(number);        s--;   /* went to far go back */        break;    }  }}PUBLIC int#ifdef __STDC__vsnprintf(char *string, size_t length, const char * format, va_list args)#elsevsnprintf(string, length, format, args)char *string;size_t length;char * format;va_list args;#endif{  struct DATA data;  char conv_field[MAX_FIELD];  double d; /* temporary holder */  int state;  int i;  data.length = length - 1; /* leave room for '\0' */  data.holder = string;  data.pf = format;  data.counter = 0;/* sanity check, the string must be > 1 */  if (length < 1)    return -1;  for (; *data.pf && (data.counter < data.length); data.pf++) {    if ( *data.pf == '%' ) { /* we got a magic % cookie */      conv_flag((char *)0, &data); /* initialise format flags */      for (state = 1; *data.pf && state;) {        switch (*(++data.pf)) {          case '\0': /* a NULL here ? ? bail out */            *data.holder = '\0';            return data.counter;            break;          case 'f':  /* float, double */            STAR_ARGS(&data);            d = va_arg(args, double);            floating(&data, d);              state = 0;            break;          case 'g':           case 'G':            STAR_ARGS(&data);            DEF_PREC(&data);            d = va_arg(args, double);            i = log_10(d);            /*             * for '%g|%G' ANSI: use f if exponent             * is in the range or [-4,p] exclusively             * else use %e|%E             */            if (-4 < i && i < data.precision)              floating(&data, d);            else              exponent(&data, d);            state = 0;            break;          case 'e':          case 'E':  /* Exponent double */            STAR_ARGS(&data);            d = va_arg(args, double);            exponent(&data, d);            state = 0;            break;          case 'u':          case 'd':  /* decimal */            STAR_ARGS(&data);            if (data.a_long == FOUND)              d = va_arg(args, long);            else              d = va_arg(args, int);            decimal(&data, d);            state = 0;            break;          case 'o':  /* octal */            STAR_ARGS(&data);            if (data.a_long == FOUND)              d = va_arg(args, long);            else              d = va_arg(args, int);            octal(&data, d);            state = 0;            break;          case 'x':           case 'X':  /* hexadecimal */            STAR_ARGS(&data);            if (data.a_long == FOUND)              d = va_arg(args, long);            else              d = va_arg(args, int);            hexa(&data, d);            state = 0;            break;          case 'c': /* character */            d = va_arg(args, int);            PUT_CHAR(d, &data);            state = 0;            break;          case 's':  /* string */            STAR_ARGS(&data);            strings(&data, va_arg(args, char *));            state = 0;            break;          case 'n':             *(va_arg(args, int *)) = data.counter; /* what's the count ? */             state = 0;             break;          case 'l':            data.a_long = FOUND;            break;          case 'h':            break;          case '%':  /* nothing just % */            PUT_CHAR('%', &data);            state = 0;            break;          case '#': case ' ': case '+': case '*':          case '-': case '.': case '0': case '1':           case '2': case '3': case '4': case '5':          case '6': case '7': case '8': case '9':           /* initialize width and precision */            for (i = 0; isflag(*data.pf); i++, data.pf++)               if (i < MAX_FIELD - 1)                conv_field[i] = *data.pf;            conv_field[i] = '\0';            conv_flag(conv_field, &data);            data.pf--;   /* went to far go back */            break;          default:            /* is this an error ? maybe bail out */            state = 0;            break;        } /* end switch */      } /* end of for state */    } else { /* not % */      PUT_CHAR(*data.pf, &data);  /* add the char the string */    }  }  *data.holder = '\0'; /* the end ye ! */  return data.counter;}#ifndef HAVE_SNPRINTFPUBLIC int#if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__snprintf(char *string, size_t length, const char * format, ...)#elsesnprintf(string, length, format, va_alist)char *string;size_t length;char * format;va_dcl#endif{  int rval;  va_list args;#if defined(HAVE_STDARG_H) && defined(__STDC__) && __STDC__  va_start(args, format);#else  va_start(args);#endif  rval = vsnprintf (string, length, format, args);  va_end(args);  return rval;}#endif /* HAVE_SNPRINTF */#ifdef DRIVER#include <stdio.h>/* set of small tests for snprintf() */void main(){  char holder[100];  int i;/*  printf("Suite of test for snprintf:\n");  printf("a_format\n");  printf("printf() format\n");  printf("snprintf() format\n\n");*//* Checking the field widths */  printf("/%%d/, 336\n");  snprintf(holder, sizeof holder, "/%d/\n", 336);  printf("/%d/\n", 336);  printf("%s\n", holder);  printf("/%%2d/, 336\n");  snprintf(holder, sizeof holder, "/%2d/\n", 336);  printf("/%2d/\n", 336);  printf("%s\n", holder);  printf("/%%10d/, 336\n");  snprintf(holder, sizeof holder, "/%10d/\n", 336);  printf("/%10d/\n", 336);  printf("%s\n", holder);  printf("/%%-10d/, 336\n");  snprintf(holder, sizeof holder, "/%-10d/\n", 336);  printf("/%-10d/\n", 336);  printf("%s\n", holder);/* floating points */  printf("/%%f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%f/\n", 1234.56);  printf("/%f/\n", 1234.56);  printf("%s\n", holder);  printf("/%%e/, 1234.56\n");  snprintf(holder, sizeof holder, "/%e/\n", 1234.56);  printf("/%e/\n", 1234.56);  printf("%s\n", holder);  printf("/%%4.2f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%4.2f/\n", 1234.56);  printf("/%4.2f/\n", 1234.56);  printf("%s\n", holder);  printf("/%%3.1f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%3.1f/\n", 1234.56);  printf("/%3.1f/\n", 1234.56);  printf("%s\n", holder);  printf("/%%10.3f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%10.3f/\n", 1234.56);  printf("/%10.3f/\n", 1234.56);  printf("%s\n", holder);  printf("/%%10.3e/, 1234.56\n");  snprintf(holder, sizeof holder, "/%10.3e/\n", 1234.56);  printf("/%10.3e/\n", 1234.56);  printf("%s\n", holder);  printf("/%%+4.2f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%+4.2f/\n", 1234.56);  printf("/%+4.2f/\n", 1234.56);  printf("%s\n", holder);  printf("/%%010.2f/, 1234.56\n");  snprintf(holder, sizeof holder, "/%010.2f/\n", 1234.56);  printf("/%010.2f/\n", 1234.56);  printf("%s\n", holder);#define BLURB "Outstanding acting !"/* strings precisions */  printf("/%%2s/, \"%s\"\n", BLURB);  snprintf(holder, sizeof holder, "/%2s/\n", BLURB);  printf("/%2s/\n", BLURB);  printf("%s\n", holder);  printf("/%%22s/ %s\n", BLURB);  snprintf(holder, sizeof holder, "/%22s/\n", BLURB);  printf("/%22s/\n", BLURB);  printf("%s\n", holder);  printf("/%%22.5s/ %s\n", BLURB);  snprintf(holder, sizeof holder, "/%22.5s/\n", BLURB);  printf("/%22.5s/\n", BLURB);  printf("%s\n", holder);  printf("/%%-22.5s/ %s\n", BLURB);  snprintf(holder, sizeof holder, "/%-22.5s/\n", BLURB);  printf("/%-22.5s/\n", BLURB);  printf("%s\n", holder);/* see some flags */  printf("%%x %%X %%#x, 31, 31, 31\n");  snprintf(holder, sizeof holder, "%x %X %#x\n", 31, 31, 31);  printf("%x %X %#x\n", 31, 31, 31);  printf("%s\n", holder);  printf("**%%d**%% d**%% d**, 42, 42, -42\n");  snprintf(holder, sizeof holder, "**%d**% d**% d**\n", 42, 42, -42);  printf("**%d**% d**% d**\n", 42, 42, -42);  printf("%s\n", holder);/* other flags */  printf("/%%g/, 31.4\n");  snprintf(holder, sizeof holder, "/%g/\n", 31.4);  printf("/%g/\n", 31.4);  printf("%s\n", holder);  printf("/%%.6g/, 31.4\n");  snprintf(holder, sizeof holder, "/%.6g/\n", 31.4);  printf("/%.6g/\n", 31.4);  printf("%s\n", holder);  printf("/%%.1G/, 31.4\n");  snprintf(holder, sizeof holder, "/%.1G/\n", 31.4);  printf("/%.1G/\n", 31.4);  printf("%s\n", holder);  printf("abc%%n\n");  printf("abc%n", &i); printf("%d\n", i);  snprintf(holder, sizeof holder, "abc%n", &i);  printf("%s", holder); printf("%d\n\n", i);    printf("%%*.*s --> 10.10\n");  snprintf(holder, sizeof holder, "%*.*s\n", 10, 10, BLURB);  printf("%*.*s\n", 10, 10, BLURB);  printf("%s\n", holder);  printf("%%%%%%%%\n");  snprintf(holder, sizeof holder, "%%%%\n");  printf("%%%%\n");  printf("%s\n", holder);#define BIG "Hello this is a too big string for the buffer"/*  printf("A buffer to small of 10, trying to put this:\n");*/  printf("<%%>, %s\n", BIG);   i = snprintf(holder, 10, "%s\n", BIG);  printf("<%s>\n", BIG);  printf("<%s>\n", holder);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -