2011-11-16 3 views
0

나는 연결을하는 프로그램을 가지고있다.C에서의 연결

해당 char * testConc (int a, ..) 여기서 a는 연결을 위해 전달되는 인수의 수를 나타냅니다. 는 생성자와 같은 아무것도에 과부하 legth이 변화에 계속 거기입니다 C

또는 기능을 구현하는 간단한 문법

+0

를? –

답변

2

C 기능 과부하 기능이 없습니다 있습니다. 가지고있는 구문을 variadic function이라고 부르며 요청한 내용을 수행하는 데 사용할 수 있습니다.

textConc 기능은 다음과 같이 보일 것입니다 :

char *textConc(int argc, ...) 
{ 
    va_list args; 
    char *str = NULL; 
    size_t len = 0; 

    va_start(args, argc); 
    while (argc--) 
    { 
     /* next string */ 
     const char *temp = va_arg(args, const char *); 
     size_t size = strlen(temp); 
     /* make room and copy over */ 
     str = realloc(str, len+size+1); 
     memcpy(str+len, temp, size+1); 
     /* new length */ 
     len += size; 
    } 
    va_end(args); 

    return str; 
} 

int main(int argc, char **argv) 
{ 
    char *example = textConc(4, "Hello", "All", "good", "morning"); 
    puts(example); 
    free(example); 
    return 0; 
} 

당신은 GCC를 사용하는 경우

, 우리는 가짜 매크로의 약간의 도움을 사용하여 완전히 오버로드 할 수 있습니다.

이름 바꾸기 textConc textConcN에 다음과 같은 매크로를 사용 : 당신이 길이는 계속 변화 무슨 뜻 이죠

#define ARGCOUNT(...) (sizeof((const char *[]){__VA_ARGS__})/sizeof(const char *)) 
#define textConc(...) textConcN(ARGCOUNT(__VA_ARGS__), __VA_ARGS__) 


int main(int argc, char **argv) 
{ 
    /* notice, no more need for the number of arguments */ 
    char *example = textConc("Hello", "All", "good", "morning"); 
    puts(example); 
    free(example); 
    return 0; 
} 
+0

당신의 솔루션은 매우 도움이되었습니다. 위즈 (Wiz),하지만 line const. * temp = va_arg (args, const char *); 그것은 구문 오류 'const'를 말합니다. 나는 컴파일을 위해 cl을 사용하고 있습니다. – Kittu

+0

@kittu vs cl? 나를 위해 잘 컴파일 된? – Wiz

0

기능 당신은 귀하의 기능을 다시 작성할 수 C.

에 오버로드 할 수 없습니다 이 실제 인수 용이의 수를 변경 추가하게

testConc("foo", "bar", "baz", "quux", (char *)0); 

: 당신이 NULL와리스트의 끝을 표시 char *testConc(const char *s, ...). 당신은 C99 컴파일러가있는 경우, 당신도 당신을위한 NULL을 추가하는 포장 매크로를 작성할 수 있습니다

#define TESTCONC(...) testConc(__VA_ARGS__, (char *)0) 
+0

프로그램의 흐름은 다음과 같습니다. 메인 프로그램에서 testConc (2, "good", "morning")을 전달합니다. 여기서 정수 2는 3을 지나가거나 testConc (4, "Hello", "All" , "good", "morning") 어디 4 4 agguments.I에 대한 정의를 char * testConc (int a, ..) 및 인수의 개수가 고정되지 연결에 대한 서브 루틴을 작성하는 데 도움이 필요합니다. – Kittu

3

예, varadic functions

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

/* print all non-negative args one at a time; 
    all args are assumed to be of int type */ 
void printargs(int arg1, ...) 
{ 
    va_list ap; 
    int i; 

    va_start(ap, arg1); 
    for (i = arg1; i >= 0; i = va_arg(ap, int)) 
    printf("%d ", i); 
    va_end(ap); 
    putchar('\n'); 
} 

int main(void) 
{ 
    printargs(5, 2, 14, 84, 97, 15, 24, 48, -1); 
    printargs(84, 51, -1); 
    printargs(-1); 
    printargs(1, -1); 
    return 0; 
}