나는 연결을하는 프로그램을 가지고있다.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.
에 오버로드 할 수 없습니다 이 실제 인수 용이의 수를 변경 추가하게
testConc("foo", "bar", "baz", "quux", (char *)0);
: 당신이 NULL
와리스트의 끝을 표시 char *testConc(const char *s, ...)
. 당신은 C99 컴파일러가있는 경우, 당신도 당신을위한 NULL
을 추가하는 포장 매크로를 작성할 수 있습니다
#define TESTCONC(...) testConc(__VA_ARGS__, (char *)0)
프로그램의 흐름은 다음과 같습니다. 메인 프로그램에서 testConc (2, "good", "morning")을 전달합니다. 여기서 정수 2는 3을 지나가거나 testConc (4, "Hello", "All" , "good", "morning") 어디 4 4 agguments.I에 대한 정의를 char * testConc (int a, ..) 및 인수의 개수가 고정되지 연결에 대한 서브 루틴을 작성하는 데 도움이 필요합니다. – 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;
}
를? –