我有一个计划,做串联。级联使用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;
}
你是什么意思长度不断变化? –