2011-11-16 27 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

你的溶液veryhelpful奇才,但在线路为const char *临时=在va_arg(参数,常量字符*);它说的语法错误'const'。我用cl来编译。 – Kittu

+0

@kittu vs cl?对我来说编好了吗? – Wiz

0

功能无法在C.

超载你可以重写你的功能char *testConc(const char *s, ...),在那里你标记列表与NULL末:

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

这使得加改变的实际参数更容易的数量。如果你有一个C99编译器,你甚至可以编写一个包装宏添加NULL为您提供:

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

程序流是这样的。在主程序中我会传递testConc(2,“good”,“morning”),其中整数2表示我传递了三个,或者我可以通过testConc(4,“Hello”,“All” ,论据“好”,“早晨”),其中4对4 agguments.I需要进行连结,其定义为char * testConc写子程序的帮助(INT一,..)和数量是不固定的。 – 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; 
}