2013-04-15 1 views
1

*printf 함수에서 필요한 문자의 목표 길이가 필요합니다. 내 시나리오는 결국 문자열을 작성해야하는 로깅 기능입니다 (관련이없는 일은 char *으로 끝나야합니다).* printf 함수 군의 목표 길이를 얻으십시오.

나는 현재이 있습니다

매력처럼 작동하지만, 지나치게 복잡한 것 같다
void log(char *format, ...) 
{ 
    char *full_message, *message; 
    FILE *nullfile; 
    va_list args; 

    va_start(args, format); 
    nullfile = fopen("/dev/null", "w"); 
    message_len = vfprintf(nullfile, format, args) + 1; 
    fclose(nullfile); 
    va_end(args); 

    va_start(args, format); 
    message = malloc(message_len); 
    vsnprintf(message, message_len, format, args); 
    va_end(args); 

    // now do something with the final message 
} 

. 더 쉬운 방법이 있습니까? 뭔가 더 의미가 있습니다.

추가 세부 사항 : 나는 마지막으로 문자열을 더 포맷하고 OpenSSL BIO에 덤프하므로 vfprinf을 사용하는 것만 큼 쉽지는 않습니다.

답변

3

파일 대신에 NULL 포인터와 버퍼 크기가 모두 필요하기 때문에 대신 vsnprintf()을 사용하면 간단하고 합리적인 단순화가 가능합니다. 다소 우아한. (그리고 C와 같은 함수를 두 번 호출하는 것은 일반적인 관용구입니다. 처음으로 버퍼 길이를 계산하고 두 번째로 실제로 작업을 완료하는 것입니다.)

va_start(args, format); 
int message_len = vsnprintf(NULL, 0, format, args) + 1; 
va_end(args); 

아, 그리고 ...

void log(char *format, ...) 

정말

void log(const char *format, ...) 

해야한다.

void log(char *format, ...) 
{ 
    char *message; 
    va_list args; 

    va_start(args, format); 
    message_len = vsnprintf(0, 0, format, args) + 1; 
    va_end(args); 

    va_start(args, format); 
    message = malloc(message_len); 
    vsnprintf(message, message_len, format, args); 
    va_end(args); 

    // now do something with the final message 
} 
:
2

은 현재 snprintf가 무엇인지입니다
관련 문제