坚持使用myPrintf和va_arg列表

时间:2014-12-02 22:58:31

标签: c printf variadic-functions

我目前正在开发自己的scanf函数实现,但除了va_宏之外我不能使用任何库函数。

除了打印* fmt变量且不是%d,%s等的东西外,一切都很有效。

例如myPrintf(“%d stuff and more stuff%s”,50,“foo”);

只打印50foo而不是50个东西和更多东西foo

我试过搞乱swtich的默认部分,但它让我什么都没有 提前谢谢!

void myPrintf(char *fmt, ...)
{
    va_list ap;
    char *s;
    char buf[64];
    va_start(ap, fmt);

    while(*fmt)
    {
        x++;
        switch(*fmt++)
        {
        case 's':
            s = va_arg(ap, char*);
            write(1,s,strlen(s));
            break;
        case 'd':
            s = toString(va_arg(ap, int));
            write(1,s,strlen(s));
            break;
        case 'b':
            s = toBin(va_arg(ap, int));
            write(1,s,strlen(s));
            break;
        default:
            break;
        }
    va_end(ap);
   }

}

1 个答案:

答案 0 :(得分:1)

它打印50foo,因为它只在看到" d"或" s"或" b"在fmt。你应该检查"%"打印您提供的参数,否则从fmt打印字符。它应该类似于下面的代码:

void myPrintf(char *fmt, ...)
{
    va_list ap;
    char *s;
    char c;
    char s2[100];
    char buf[64];
    va_start(ap, fmt);

    while(*fmt)
    {
        c = *fmt;
        if (c == '%') {
            fmt++;
            switch(*fmt)
            {
            case 's':
                s = va_arg(ap, char *);
                write(1, s, strlen(s));
                break;
            case 'd':
                memset(s2, 0, 100);
                sprintf(s2,"%d",va_arg(ap, int));
                write(1, s2, strlen(s2));
                break;
            default:
                break;
            }
        } else {
            write(1, fmt, 1);
        }
        va_end(ap);
        fmt++;
    }
    write(1, 0, 1);
}

好吧,我编辑了你的代码,使其在我的机器上运行,因为我没有toString()和toBin()的实现。但是,上面的实现将告诉你哪里弄错了。代码正在检查"%"符号首先,当它看到"%"然后它检查"%s"和"%d"打印论据' 50'和' foo'。在所有其他情况下,它打印来自fmt的字符,所以'东西和更多东西'也打印到stdin。