2014-12-02 15 views
0

我目前正在開發自己的scanf函數實現,但我無法使用除va_宏之外的任何庫函數。與myPrintf和va_arg列表卡在一起

一切都非常作品除了印刷的東西,是在* FMT變量,而不是一個%d,%S等

例如myPrintf( 「%d的東西,更多的東西%的」,50, 「foo」 的);

只打印50foo,而不是50的東西,更多的東西富

我試着用馬桶蓋的默認部分瞎搞,但它使我沒有什麼 預先感謝您!

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

提示:您的代碼從不檢查格式轉換字符'%',那麼您的代碼如何知道它是解析格式說明符還是字符串中的普通字符? – FatalError 2014-12-02 23:03:20

+0

@FatalError好點,但仍然有點困惑如何做到這一點 – tomiQrsd 2014-12-02 23:16:48

+0

基本上,你需要知道前一個字符是否是'%'。最簡單的方法是保留一個布爾值,當前一個字符爲'%'時爲true。如果是這樣,開始分析格式說明符。否則,它只是一個普通的字符,你應該從字面上處理它。 – FatalError 2014-12-02 23:18:33

回答

1

它打印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()和託賓的實現()。但是,上面的實現會告訴你錯誤的地方。代碼首先檢查「%」符號,當它看到「%」時,它會檢查「%s」和「%d」以打印參數'50'和'foo'。在所有其他情況下,它會打印fmt中的字符,因此'stuff and more stuff'也會打印到stdin。

+0

感謝人!這樣做的工作!你真棒! – tomiQrsd 2014-12-02 23:37:57