2011-11-16 48 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; 
}