2013-07-24 4 views
0

어떻게 va_args가 작동하는지 배우려고합니다.이 함수의 내부에서 형식 문자열과 args 목록을 병합하고 싶습니다. 지금 그것을하고있는 im가 단지 jiberish를 가져 오는 길. 거대한 프로세싱 기능을 쓰지 않아도되는 방법이 있을까요?sprintf를 사용하는 C 프로그래밍 처리 va_args?

va_start(listPointer, msg); 
#ifdef DEBUG 
fprintf(stderr, msg, listPointer); 
#endif 
str = (char *)calloc(sizeof(MAX_LINE_SIZE), sizeof(char)); 
if(str == NULL){ 
    fprintf(stderr, "out of memory exception"); 
    return; 
} 
snprintf(str, MAX_LINE_SIZE, listPointer); 
printf("testing: %s\n", str); 
ret = write(logger, str, strlen(str)); 
if(ret == -1){ 
    fprintf(stderr, 
      "Could not write to file with error: %s\n", 
      strerror(errno)); 
    fprintf(stderr, "Cannot continue with error logging"); 
} 
va_end(listPointer); 
+3

에 오신 것을 환영합니다 데이터를 포맷, 무엇을해야 할 수 있습니다. 곧 [About] 페이지를 읽으십시오. 또한 SSCCE ([단편, 자체 포함, 올바른 예] (http://sscce.org/))를 제공하면 끝나지 않습니다. 우리는 여러분의 코드 앞에 void 함수 (const char * msg, ...) {va_list listPointer; '가 있다고 추측 할 필요는 없습니다. 적어도 완전한 기능을 제공하십시오. 'vsnprintf()'또는'v * printf()'패밀리의 다른 멤버 중 하나를 사용해야합니다. –

+2

['calloc'] (http://linux.die.net/man/3/calloc) 호출은 자신이하는 일을 생각하지 않습니다. –

답변

3

vsprintf 또는 vsnprintf 기능을 사용합니다. 매개 변수 목록을 가져 오는 대신 해당 매개 변수에 대해 va_list를 사용합니다.

vsnprintf(str, MAX_LINE_SIZE, listPointer); 
1

쌍으로 가변 인수 함수를 작성 :

당신은 그것을 부를 것이다

void ellipsis_function(const char *fmt, ...) 
{ 
    va_list args; 
    va_start(args, fmt); 
    valist_function(fmt, args); 
    va_end(args); 
} 

void valist_function(const char *fmt, va_list args) 
{ 
    vfprintf(stderr, fmt, args); 
} 

첫 번째 함수는 내가 보여 주었다 것과 매우 근접해야합니다; 여분의 고정 된 인수가있을 수 있으며, 아마도 반환 값을 캡처 할 수 있습니다. 그렇지 않으면 정말 간단합니다.

두 번째 기능은 스택 오버플로 등 vsnprintf() 등으로 문자열로

관련 문제