我有一個計劃,做串聯。級聯使用C
其類似char * testConc(int a,..) 其中,a表示串聯傳遞參數的數量。 作爲legth不斷變化的有像構造什麼負荷過重用C
或任何簡單的語法,它實現的功能
我有一個計劃,做串聯。級聯使用C
其類似char * testConc(int a,..) 其中,a表示串聯傳遞參數的數量。 作爲legth不斷變化的有像構造什麼負荷過重用C
或任何簡單的語法,它實現的功能
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;
}
功能無法在C.
超載你可以重寫你的功能char *testConc(const char *s, ...)
,在那裏你標記列表與NULL
末:
testConc("foo", "bar", "baz", "quux", (char *)0);
這使得加改變的實際參數更容易的數量。如果你有一個C99編譯器,你甚至可以編寫一個包裝宏添加NULL
爲您提供:
#define TESTCONC(...) testConc(__VA_ARGS__, (char *)0)
程序流是這樣的。在主程序中我會傳遞testConc(2,「good」,「morning」),其中整數2表示我傳遞了三個,或者我可以通過testConc(4,「Hello」,「All」 ,論據「好」,「早晨」),其中4對4 agguments.I需要進行連結,其定義爲char * testConc寫子程序的幫助(INT一,..)和數量是不固定的。 – Kittu
#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;
}
你是什麼意思長度不斷變化? –