C Variadic functions

Run Settings
LanguageC
Language Version
Run Command
#include <stdio.h> #include <time.h> #include <stdarg.h> #include <string.h> void vlog(const char *fmt, va_list args) { char msg[16]; time_t now = { time(NULL) }; strftime(msg, sizeof msg, "%T", localtime(&now)); printf("[%s] ", msg); vprintf(fmt, args); /* vprintf(const char *fmt, va_list args) */ } void log(const char *fmt, ...) { va_list args; va_start(args, fmt); vlog(fmt, args); va_end(args); } int vsum(int n, va_list args) { int ret = 0; while (n--) ret += va_arg(args, int); return ret; } int sum(int n, ...) { va_list args; va_start(args, n); int ret = vsum(n, args); va_end(args); return ret; } char *append_str(char *str, char *app) { str = realloc(str, strlen(str) + strlen(app) + 1); strncpy(str + strlen(str), app, strlen(app) + 1); return str; } char *make_exp_str(int n, va_list args, int ret) { char *str = (char *)malloc(3); strcpy(str, "%d"); char fmt[] = " + %d"; log("n = %d, str = %s\n", n, str); while (--n) { str = append_str(str, fmt); log("n = %d, str = %s\n", n, str); } char *result = (char *)malloc(15); sprintf(result, " = %d", ret); str = append_str(str, result); free(result); return str; } void task_sum(int n, ...) { va_list args1, args2; va_start(args1, n); va_copy(args2, args1); /* args2 = args1.copy() */ int ret = vsum(n, args2); log("ret = %d\n", ret); va_end(args2); char *fmt = make_exp_str(n, args1, ret); vlog(fmt, args1); free(fmt); va_end(args1); } int main(void) { task_sum(5, 1, 2, 3, 4, 5); return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines