2011-09-07 26 views
0

我想从我的可变参数函数输入值中获取一个字符串(const char *)。 但下面这段代码不行.....运行时错误是结果C可变参数函数如何从输入获取字符串

void print(const char fmt[], ...) { 
    va_list ap; 
    const char *p=fmt; 
    va_start(ap,fmt); 
    while(*p) { 
     if(*p == '%') { 
      p ++; 
      if (*p == 'i') { 
       int num = va_arg(ap, int); 
       fprintf(output, "%d", num); 
      } else if (*p == 'f') { 
       float num = va_arg(ap, float); 
       fprintf(output, "%f", num); 
      } else if (*p == 's') { 
       const char* str = va_arg(ap, const char*); 
       fprintf(output, "%s", str); 
      } else 
       break; 
      p ++; 
     } else 
      break; 
    } 
    va_end(ap); 
} 
// This is how I call the function: 
print("%s%f", "Num: ", 12.34); 

任何想法?

+6

什么样的运行时错误? – arnaud576875

+0

请更多地显示该函数的代码,以及您如何调用它。 – Mat

+0

为什么不直接调用fprintf' – ThiefMaster

回答

0

毫无疑问,这在你没有显示的代码的某些部分[编辑:或当时没有显示]。这是一个(完全不完整的)我多年前写的printf(和家庭)的模仿。它不实现通常的宽度/精度/标志等,但适用于简单的事情,如%d,%s等。

#include <stdarg.h> 
#include <stdio.h> 
#include <string.h> 

int my_vfprintf(FILE *file, char const *fmt, va_list arg) { 

    int int_temp; 
    char char_temp; 
    char *string_temp; 
    char ch; 
    int length = 0; 

    char buffer[512]; 

    while (ch = *fmt++) { 
     if ('%' == ch) { 
      switch (ch = *fmt++) { 
       /* %% - print out a single % */ 
       case '%': 
        fputc('%', file); 
        length++; 
        break; 

       /* %c: print out a character */ 
       case 'c': 
        char_temp = va_arg(arg, int); 
        fputc(char_temp, file); 
        length++; 
        break; 

       /* %s: print out a string  */ 
       case 's': 
        string_temp = va_arg(arg, char *); 
        fputs(string_temp, file); 
        length += strlen(string_temp); 
        break; 

       /* %d: print out an int   */ 
       case 'd': 
        int_temp = va_arg(arg, int); 
        itoa(int_temp, buffer, 10); 
        fputs(buffer, file); 
        length += strlen(buffer); 
        break; 

       /* %x: print out an int in hex */ 
       case 'x': 
        int_temp = va_arg(arg, int); 
        itoa(int_temp, buffer, 16); 
        fputs(buffer, file); 
        length += strlen(buffer); 
        break; 
      } 
     } 
     else { 
      putc(ch, file); 
      length++; 
     } 
    } 
    return length; 
} 

int my_printf(char const *fmt, ...) { 
    va_list arg; 
    int length; 

    va_start(arg, fmt); 
    length = my_vfprintf(stdout, fmt, arg); 
    va_end(arg); 
    return length; 
} 

int my_fprintf(FILE *file, char const *fmt, ...) { 
    va_list arg; 
    int length; 

    va_start(arg, fmt); 
    length = my_vfprintf(file, fmt, arg); 
    va_end(arg); 
    return length; 
} 


#ifdef TEST 

int main() { 
    my_printf("%s", "Some string"); 
    return 0; 
} 

#endif 
相关问题