继续sprintf函数,这次亲自动手写了一个myprintf,是不是更有意思了,当然别指望我的代码没有bug。

#include <stdio.h>

typedef char *va_list;

#define __va_rounded_size(TYPE) \
(((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int))

#define va_start(AP, LASTARG) \
(AP=((char *)&(LASTARG)+__va_rounded_size(LASTARG)))

#define va_end(AP) ((va_list)0)

#define va_arg(AP, TYPE) \
(AP+=__va_rounded_size(TYPE), \
*((TYPE *)(AP-__va_rounded_size(TYPE))))

int myprintf(char *buf, char *fmt, ...);
void itoa(int num, char *buf, unsigned int base);
unsigned int div(unsigned int *n, unsigned int b);

int main(void) {
    char buf[0x100];
    myprintf(buf, "         s     d     x      c   \
      s", "Hello World!", 0xfffe, 65535, 'c', "sssss");
    printf("%s", buf);
}

int myprintf(char *buf, char *fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    char buf1[64], *temp1;
    int d;
    char *s, c;
    while (*fmt) {
        switch (*fmt++) {            
            case 's':
                s = (char *)va_arg(ap, char *);
//                printf("%s\n", s);
                while(*s)
                    *buf++ = *s++;
                break;
            case 'c':
                c = (char)va_arg(ap, char);
//                printf("%c\n", c);
                    *buf++ = c;
                break;
            case 'd':
                d = (int)va_arg(ap, int);
//                printf("%d\n", d);
                itoa(d, buf1, 10);
                temp1 = buf1;
                while (*temp1) {
                *buf++ = *temp1++;
                }
//                printf("*************%s\n", buf1);
                break;
            case 'x':
                d = (int)va_arg(ap, int);
//                printf("%d\n", d);
                *buf++ = '0';
                *buf++ = 'x';
                itoa(d, buf1, 16);
                temp1 = buf1;
                while (*temp1) {
                *buf++ = *temp1++;
                }
//                printf("*************%s\n", buf1);
                break;
            case ' ':
//                printf("|Space|\n");
                *buf++ = ' ';
                break;
        }
    }
    va_end(ap);
    *buf = '\0';
}

unsigned int div(unsigned int *n, unsigned int b) {
    int res;
    res = *n % b;
    *n = *n / b;
    return res;     
}

void itoa(int num, char *buf, unsigned int base) {
    char digits[16] = "0123456789abcdef";
    char temp[64];
    int i = 0;
    while (num)
        *(temp + i++) = digits[div(&num, base)];
    while (i-- > 0)
        *buf++ = *(temp + i); 
    *(buf) = '\0';
}
 

扫描二维码关注公众号,回复: 3491265 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/82813310