1. 程式人生 > >關於sprintf,好不容易從網上找到了一篇好文章也給大家發一下吧

關於sprintf,好不容易從網上找到了一篇好文章也給大家發一下吧

這個程式碼算原創有些勉強,不管怎樣粘過去,可以用在win下除錯的,我看過這個後,儘管仍然有很多迷惑,不過覺得比以前更直觀了,有了那麼一點點感覺。

#include <stdio.h>

typedef char *va_list;

// 此處程式碼看了兩種不同的實現,最後發現其實應該是一樣的,當然也把不一樣的寫在註釋裡面了

#define INTSIZEOF(n) (((sizeof(n)+sizeof(int)-1)/sizeof(int)) * sizeof(int)) // ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) #define va_start(ap,v) (ap=((va_list)&(v)+INTSIZEOF(v))) #define va_arg(ap,t) ((ap += INTSIZEOF(t)),( *(t *)(ap - INTSIZEOF(t)) ) ) //( *(t *)((ap += INTSIZEOF(t)) - INTSIZEOF(t)) ) #define va_end(ap) (ap=(va_list)0)

int myprintf(char *buf, char *fmt, ...);

int main(void){     printf("%d\n", INTSIZEOF(char));     printf("%d\n", INTSIZEOF(int));     printf("%d\n", INTSIZEOF(short));     char buf[500];     myprintf(buf, "s d c d , s ? s", "are", 5, 'A', 5, "HEllo, wolrd!", "my name is ideal");

    return 1; }

int myprintf(char *buf, char *fmt, ...) {     va_list ap;     va_start(ap, fmt);     int d;     char c, *s;     while (*fmt) {         switch (*fmt++)         {               case 's':              /* string */                   s = va_arg(ap, char *);                   printf("string %s\n", s);                   break;               case 'd':              /* int */                   d = va_arg(ap, int);                   printf("int %d\n", d);                   break;               case 'c':              /* char */                   /* need a cast here since va_arg only                   takes fully promoted types */                   c = (char) va_arg(ap, int);                   printf("char %c\n", c);                   break;              case ' ':                 printf("|     |\n");                 break;             case ',':                 printf(",\n");                 break;             case '?':                 goto exit;                 break;         }     }     exit:     va_end(ap);   }