คำอธิบายปัญหา
สมมติว่าเราต้องการสร้างฟังก์ชันที่รับจำนวนอาร์กิวเมนต์ไม่คงที่ เราต้องการสร้าง 3 ฟังก์ชันคือ sum(), max() และ min() ที่คำนวณผลรวม ค่าสูงสุด และค่าต่ำสุดของตัวเลขที่ส่งเข้ามา ฟังก์ชันแต่ละตัวจะรับจำนวนอาร์กิวเมนต์ (count) เป็นพารามิเตอร์ตัวแรก ในการนิยามฟังก์ชันแบบนี้ เราต้องใช้ ellipsis (...) สามจุด ในพารามิเตอร์ของฟังก์ชัน และต้อง include ไฟล์หัวข้อ stdarg.h ฟังก์ชันประเภทนี้เรียกว่า Variadic Functions
องค์ประกอบสำคัญของ stdarg.h
- va_list: เก็บอาร์กิวเมนต์ทั้งหมดที่ส่งมา
- va_start: เริ่มต้นการเข้าถึงอาร์กิวเมนต์ผ่านตัวแปร ap
- va_arg: ดึงอาร์กิวเมนต์ถัดไปตามชนิดข้อมูลที่กำหนด
- va_end: จบการเข้าถึงรายการอาร์กิวเมนต์
ตัวอย่างการใช้งาน
- sum(5, 5, 2, 8, 9, 3) → 27 (ผลรวมของ 5 ตัวเลข)
- max(3, 5, 9, 2) → 9 (ค่าสูงสุดของ 3 ตัวเลข)
- min(6, 8, 5, 2, 6, 7, 9) → 2 (ค่าต่ำสุดของ 6 ตัวเลข)
โค้ดตัวอย่าง
#include <stdio.h>
#include <stdarg.h>
int sum(int cnt, ...) {
va_list ap;
int i, n = 0;
va_start(ap, cnt);
for (i = 0; i < cnt; i++) {
n += va_arg(ap, int);
}
va_end(ap);
return n;
}
int min(int cnt, ...) {
va_list ap;
int i, current, minimum = 99999;
va_start(ap, cnt);
for (i = 0; i < cnt; i++) {
current = va_arg(ap, int);
if (current < minimum) minimum = current;
}
va_end(ap);
return minimum;
}
int max(int cnt, ...) {
va_list ap;
int i, current, maximum = 0;
va_start(ap, cnt);
for (i = 0; i < cnt; i++) {
current = va_arg(ap, int);
if (current > maximum) maximum = current;
}
va_end(ap);
return maximum;
}
int main() {
printf("%d\n", sum(5, 5, 2, 8, 9, 3));
printf("%d\n", max(3, 5, 9, 2));
printf("%d\n", min(6, 8, 5, 2, 6, 7, 9));
return 0;
}
อินพุต
sum(5, 5, 2, 8, 9, 3) max(3, 5, 9, 2) min(6, 8, 5, 2, 6, 7, 9)
เอาต์พุต
27 9 2