2017-10-03 1 views
0

다양한 타입의 인자를 취할 수있는 함수를 만들고 싶습니다. 내 문제는 어떻게 인수 형식을 구문 분석 할 수 있습니다. like 호출자는 형식 지정자를 지정하지 않고 모든 형식의 인수를 임의의 순서로 전달할 수 있습니다. 그래서 호출 함수에서 어떻게 타입을 구별 할 수 있습니까?다양한 타입의 인자를 c로 넘겨주기

var_argument 함수에서 호출자가 전달한 모든 값을 출력하는 방법은?

하자 여기 내 C 코드

#include <stdio.h> 
#include <stdarg.h> 
void var_argument(int num,...); 

int main() 
{ 
var_argument(3,"Hello",7.87f,6); 
var_argument(3,7.87f,"Hello",6); 
return 0; 
} 

void var_argument(int num,...) 
{ 
char str[80]; 
/* What code should I write to differentiate between types and to print all the values passed by the caller */  

va_list list; 
va_start(list,num); 

/* How to do sprintf of the parameter passed to this function and store 
the formatted output in the array str */ 
} 
+0

같은 모든 지원되는 유형을 열거 enum을 수 있을까? –

+0

인수의 유형을 제공하려면 다른 매개 변수가 필요합니다. 이는 유일한 (휴대용) 방법입니다. ('% d','% f', ...) 형식의 형식을 추론하는'printf'와 같습니다. – Holt

+0

'...'앞에 오는 인수는 전통적으로 유형을 나타내며 크기는 그 것으로부터 추론됩니다. –

답변

0

이 어떻게 든 이미 이루어집니다 예를 들어 printf() 같은 메커니즘을 가지고있다 내가 발신자

에 의해 전달 된 매개 변수의 var_argument 기능 내부의 sprintf을하고 싶은 말은. 변수 인수 함수의 경우 변수 매개 변수의 일부가 아닌 첫 번째 매개 변수가 필요합니다. 서식 문자열로 사용하여 x 위치의 위치를 ​​n으로 결정하십시오.

첫 번째 매개 변수는 필수 항목이므로 필수 매개 변수가 있어야하며 변수 인수에 무엇을 나타낼 지 표시기로 사용하는 것이 자연스럽게 보입니다.

는, 예를 들어이 걸릴 물론

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

int 
variable(const char *format, ...) 
{ 
    va_list args; 
    int count; 

    va_start(args, format); 

    count = 0; 
    while (*format != '\0') { 
     switch (*format++) { 
      case 's': 
       fprintf(stdout, "arg[%d]: %s\n", count, va_arg(args, const char *)); 
       break; 
      case 'd': 
       fprintf(stdout, "arg[%d]: %d\n", count, va_arg(args, int)); 
       break; 
      case 'f': 
       fprintf(stdout, "arg[%d]: %f\n", count, va_arg(args, double)); 
       break; 
     } 
     count += 1; 
    } 
    va_end(args); 
    return 0; 
} 

int 
main(void) 
{ 
    variable("sdf", "Example", 3, 3.1416); 
} 

, 지정자와 인수의 실제 유형 사이에 불일치가 정의되지 않은 동작과 바람직하지 않은 행동에 대한 논리적 인 결과로 이어질 것입니다. 따라서 매우 신중해야하거나 printf() 스타일 지정자를 사용하고 이러한 불일치가 발생하면 경고하도록 컴파일러에 지시해야합니다.

또 다른 해결책은 glib 님의 기능처럼 유형 지정자를 전달하고 매개 변수의 끝을 나타내는 마지막 값을 매개 변수 바로 뒤에 전달하는 것입니다. 매개 변수 "지정자"는()`의 printf`에 대해 알고 계십니까이

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

enum types { 
    String, Integer, Double, Float = Double, /* unless you want to store the value in a poitner 
               * there is normally no difference between these 
               */ 
    End 
}; 

int 
variable(enum types type, ...) 
{ 
    va_list args; 
    int count; 

    va_start(args, type); 

    count = 0; 
    while (type != End) { 
     switch (type) { 
      case String: 
       fprintf(stdout, "arg[%d]: %s\n", count, va_arg(args, const char *)); 
       break; 
      case Integer: 
       fprintf(stdout, "arg[%d]: %d\n", count, va_arg(args, int)); 
       break; 
      case Double: 
       fprintf(stdout, "arg[%d]: %f\n", count, va_arg(args, double)); 
       break; 
      default: 
       fprintf(stderr, "unknown type specifier\n"); 
       break; 
     } 
     type = va_arg(args, enum types); 
     count += 1; 
    } 

    va_end(args); 
    return 0; 
} 

int 
main(void) 
{ 
    variable(String, "Example", Integer, 3, Double, 3.1416, End); 
} 
관련 문제