1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
| #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <string.h>
int sum_integers(int count, ...) { va_list args; va_start(args, count); int total = 0; for (int i = 0; i < count; i++) { total += va_arg(args, int); } va_end(args); return total; }
double average_doubles(int count, ...) { if (count <= 0) return 0.0; va_list args; va_start(args, count); double total = 0.0; for (int i = 0; i < count; i++) { total += va_arg(args, double); } va_end(args); return total / count; }
const char* find_longest_string(int count, ...) { if (count <= 0) return NULL; va_list args; va_start(args, count); const char* longest = va_arg(args, const char*); size_t max_length = strlen(longest); for (int i = 1; i < count; i++) { const char* current = va_arg(args, const char*); size_t current_length = strlen(current); if (current_length > max_length) { longest = current; max_length = current_length; } } va_end(args); return longest; }
void my_printf(const char* format, ...) { va_list args; va_start(args, format); const char* p = format; while (*p != '\0') { if (*p == '%' && *(p + 1) != '\0') { p++; switch (*p) { case 'd': { int value = va_arg(args, int); printf("%d", value); break; } case 'f': { double value = va_arg(args, double); printf("%.2f", value); break; } case 's': { const char* value = va_arg(args, const char*); printf("%s", value); break; } case 'c': { int value = va_arg(args, int); printf("%c", value); break; } case '%': { printf("%%"); break; } default: printf("%%%c", *p); break; } } else { printf("%c", *p); } p++; } va_end(args); }
typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR } LogLevel;
void log_message(LogLevel level, const char* format, ...) { const char* level_names[] = {"DEBUG", "INFO", "WARNING", "ERROR"}; printf("[%s] ", level_names[level]); va_list args; va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); }
void demonstrate_variadic_functions(void) { printf("=== 可变参数函数演示 ===\n"); printf("整数求和:\n"); printf("sum(3, 1, 2, 3) = %d\n", sum_integers(3, 1, 2, 3)); printf("sum(5, 10, 20, 30, 40, 50) = %d\n", sum_integers(5, 10, 20, 30, 40, 50)); printf("\n浮点数平均值:\n"); printf("average(3, 1.5, 2.5, 3.0) = %.2f\n", average_doubles(3, 1.5, 2.5, 3.0)); printf("average(4, 10.0, 20.0, 30.0, 40.0) = %.2f\n", average_doubles(4, 10.0, 20.0, 30.0, 40.0)); printf("\n最长字符串:\n"); const char* longest = find_longest_string(4, "hello", "world", "programming", "C"); printf("最长字符串: \"%s\"\n", longest); printf("\n自定义printf演示:\n"); my_printf("整数: %d, 浮点数: %f, 字符串: %s, 字符: %c\n", 42, 3.14159, "Hello", 'A'); printf("\n日志函数演示:\n"); log_message(LOG_INFO, "程序启动成功"); log_message(LOG_WARNING, "内存使用率达到 %d%%", 85); log_message(LOG_ERROR, "文件 %s 打开失败,错误代码: %d", "config.txt", 404); log_message(LOG_DEBUG, "变量值: x=%d, y=%.2f", 10, 3.14); }
int main(void) { demonstrate_variadic_functions(); return 0; }
|