簡體   English   中英

卡在myPrintf和va_arg列表中

[英]Stuck with myPrintf and va_arg list

我目前正在使用我自己的scanf函數實現,但是除va_宏外,我無法使用任何庫函數。

除了打印* fmt變量中的內容(不是%d,%s等)之外,其他所有內容都可以正常工作。

例如myPrintf(“%d的東西和更多的東西%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);
   }

}

它之所以打印50foo,是因為只有在fmt中看到“ d”,“ s”或“ b”時才打印。 您應該檢查“%”以打印您提供的參數,否則打印來自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的字符,因此還將“ stuff and more stuff”打印到stdin。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM