2011-09-07 13 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 
関連する問題