2011-09-07 5 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 
관련 문제