2017-10-08 98 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++; 
    } 
}