Bằng cách nào có thể viết một hàm nhận số đối số bất kỳ?
Ta dùng <stdarg.h>. Ví dụ:
Code:
#include <stdlib.h> /* for malloc, NULL, size_t */
#include <stdarg.h> /* for va_ stuff */
#include <string.h> /* for strcat et al */
char *vstrcat(char *first, ...) // số lượng đối số không giới hạn
{
size_t len = 0;
char *retbuf;
va_list argp; // dùng kiểu va_list
char *p;
if(first == NULL)
return NULL;
len = strlen(first);
va_start(argp, first); // khởi tạo va_list với các tham số tiếp sau first
while((p = va_arg(argp, char *)) != NULL) // lấy tham số kế tiếp có kiểu char*,
/* ở đây nếu để tham số thực là kiểu khác char*, sẽ dẫn đến lỗi. Ta phải khai báo đúng kiểu của tham số thực */
len += strlen(p);
va_end(argp); // kết thúc va_list
retbuf = malloc(len + 1); /* +1 for trailing \0 */
if(retbuf == NULL)
return NULL; /* error */
(void)strcpy(retbuf, first);
va_start(argp, first); // khởi tạo lại va_list để dùng 1 lần nữa
while((p = va_arg(argp, char *)) != NULL)
(void)strcat(retbuf, p);
va_end(argp); // kết thúc va_list
return retbuf;
}
void main()
{
char *str = vstrcat("Hello, ", "world!", (char *) NULL);
char *str2 = vstrcat("Hello, ", “cruel”, "world!", (char *) NULL);
}