stdarg.h函数用法(procedure)

来源:互联网 发布:windows启动盘下载 编辑:程序博客网 时间:2024/06/15 07:34

#include <stdio.h>
#include <stdarg.h>

int func(int n, ...);
int sum(int n, ...);
int xprintf(const char * fmt, ...);

int func(int n, ...)
{
    va_list ap;
    va_start(ap, n);
    while(n-- > 0)
    {
        printf("%d\n", va_arg(ap, int));
    }
    va_end(ap);
    return 0;
}

int sum(int n, ...)
{
    int m = 0;
    va_list ap;
    va_start(ap, n);
    while(n -- > 0)
    {
        m += va_arg(ap, int);
    }
    return m;
}

void proc_d(int n)
{
    int m;
    if(n > 0)
    {
        m = n % 10;
        proc_d(n / 10);
        putchar('0' + m);
    }
}

void proc_o(int n)
{
    int m;
    if(n > 0)
    {
        m = (n & 1) | (n & 2) | (n & 4);
        proc_o(n >> 3);
        putchar('0' + m);
    }
}

void proc_x(int n)
{
    int m;
    if(n > 0)
    {
        m = (n & 1) | (n & 2) | (n & 4) | (n & 8);
        proc_x(n >> 4);
        switch(m)
        {
            case 10 : putchar('a'); break;
            case 11 : putchar('b'); break;
            case 12 : putchar('c'); break;
            case 13 : putchar('d'); break;
            case 14 : putchar('e'); break;
            case 15 : putchar('f'); break;
            default : putchar('0' + m); break;
        }
    }
}

void proc_s(const char * s)
{
    while(*s != 0)
    {
       putchar(*(s++));
    }
}
/*
int xprintf(const char * fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    while(*fmt != '\0')
    {
        if(*fmt == '%')
        {
            switch(*(++fmt))
            {
                case 'd':
                    proc_d(va_arg(ap, int));
                    break;
                case 'o':
                    proc_o(va_arg(ap, int));
                    break;
                case 'x':
                    proc_x(va_arg(ap, int));
                    break;
                case 'c':
                    putchar(va_arg(ap, int));
                    break;
                case 's':
                    proc_s(va_arg(ap, const char *));
                    break;
                case '%': putchar('%'); break;
                default : break;
            }
        }
        else
        {
            putchar(*fmt);
        }
        fmt++;
    }
    va_end(ap);
}
*/
int main()
{
    /*
    char s[0x100];
    while(1)
    {
        fgets(s, 0x100, stdin);
        xprintf(s);
    }
    */

    //proc_d(1024);
    //proc_s("abcdefg");

    /*
    int i = 10;
    xprintf("int: %d\n", 1024);
    xprintf("%d + %d = %d\n", 1, 100, 1 + 100);
    xprintf("function name: %s\n", __func__);
    xprintf("%d %d\n", i++, i++);
    */

    proc_x(1024);
    proc_x(65535);
    return 0;
}

原创粉丝点击