vprintf

#include <cstdio>
#include <cstdarg>
using namespace std;

int d_printf(const char *fmt, int a[]){
  return vprintf(fmt, (va_list)a);
}

int main(){
  int a[]={5,4,3,2,1};
  d_printf("%d %d %d %d %d\n", a);
  return 0;
}



#include <stdio.h>

void d_printf(const char *fmt, int n, int a[])
{
    static int size1, size2;
    static const char *fmt_copy;

    size1 = 4*n;        // 可变参数的空间大小
    size2 = size1 + 4;  // 还有 fmt 指针4字节, 恢复 esp 时用
    fmt_copy = fmt;

    __asm{
        // 保护要修改的 ecx/esi/edi 寄存器
        push ecx
        push esi
        push edi

        // 给 ecx/esi/edi 赋值
        mov ecx, n  // movsd 的执行次数
        mov esi, a  // a -> esi
        sub esp, size1
        mov edi, esp    // esp - size1 -> edi

        rep movsd       // n 次4字节拷贝
        push fmt_copy   // 压栈格式串(字符串指针)
        call printf

        add esp, size2  // 恢复栈
        // 恢复各个寄存器
        pop edi
        pop esi
        pop ecx
    }
}

int main()
{
    char fmt[1024]; // 格式串
    char c;         // 额外读取一个字符
    int a[1024];    // 存读到的整数
    int i;

    while(EOF != scanf("%s%c", fmt, &c)) // 读到 EOF 就结束
    {
        if(c == '\n') // 格式串后没有数字
        {
            printf("%s\n\n", fmt); // 直接打印, 不用 d_printf
            continue;
        }

        // 循环读取各个整数
        i = 0;
        do
        {
            scanf("%d%c", &a[i++], &c);
        }while(c != '\n');

        // 调用 d_printf, i 刚好是输入的整数的个数
        d_printf(fmt, i, a);
        printf("\n\n"); // 补个换行比较好看O(∩_∩)O~
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值