2017-10-08 131 views
0

我遇到問題。我嘗試自定義printf(),但是當我編譯這段代碼時,輸​​出似乎沒有如預期那樣。如何編寫自定義printf?

#include <stdio.h> 
#include <stdarg.h> 
void print(char *, ...); 

int main() 
{ 
    char str[12]="World"; 
    char c='A'; 
    int i=100; 
    print("Hello %s %c", str, c); 
} 

void print(char *c, ...) 
{ 
    char *s; 
    va_list lst; 
    va_start(lst, c); 
    while(*c!='\0') 
    { 
     if(*c!='%') 
     { 
      putchar(*c); 
      c++; 
      continue; 
     } 
     c++; 
     switch(*c) 
     { 
     case 's': fputs(va_arg(lst, char *), stdout); break; 
     case 'c': putchar(va_arg(lst, int)); break; 
     } 
    }  
} 

輸出,這似乎來了信息:Hello World 輸出:你好世界交流 我想不通爲什麼 'S,C' 出現。

回答

3

您不會在指針c上增加指針c,因此while循環會再次爲您用作選項的字符運行。

交換機情況後只需添加c++,像這樣:

void print(char *c, ...) 
{ 
    char *s; 
    va_list lst; 
    va_start(lst, c); 
    while(*c!='\0') 
    { 
     if(*c!='%') 
     { 
      putchar(*c); 
      c++; 
      continue; 
     } 
     c++; 
     switch(*c) 
     { 
      case 's': fputs(va_arg(lst, char *), stdout); break; 
      case 'c': putchar(va_arg(lst, int)); break; 
     } 
     c++; 
    } 
} 

進行此更改後,我會建議找的也處理,其中%出現在字符串的結尾的情況下,一些方式,避免遇到緩衝區溢出。例如,在切換之前,可能檢查我們是否已經到達空終止符,如果是,跳出循環。

void print(char *c, ...) 
{ 
    char *s; 
    va_list lst; 
    va_start(lst, c); 
    while(*c != '\0') 
    { 
     if(*c != '%') 
     { 
      putchar(*c); 
      c++; 
      continue; 
     } 

     c++; 

     if(*c == '\0') 
     { 
      break; 
     } 

     switch(*c) 
     { 
      case 's': fputs(va_arg(lst, char *), stdout); break; 
      case 'c': putchar(va_arg(lst, int)); break; 
     } 
     c++; 
    } 
}