關於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); }