Giả sử chúng ta muốn thực hiện một số hàm có thể nhận nhiều đối số, không có số lượng đối số cố định. Chúng ta muốn thực hiện ba hàm sum (), max () và min (), chúng có thể tính tổng của các số, cực đại của các số và cực tiểu của các số đã cho tương ứng. Mỗi hàm này sẽ lấy số lượng đối số đếm làm đối số đầu tiên của chúng. Để xác định loại hàm này, chúng ta cần sử dụng dấu ba chấm (...) vào đối số hàm. Để sử dụng nó, chúng ta phải bao gồm tệp tiêu đề stdarg.h. Loại hàm này được gọi là hàm variadict. Để truy cập các đối số biến, có bốn điều khác nhau mà chúng tôi có thể nhận thấy -
-
va_list:Cái này lưu trữ tất cả các đối số đã cho
-
va_start:Thao tác này sẽ bắt đầu truy cập biến ap đối số biến
-
va_arg:Điều này được sử dụng để truy xuất đối số tiếp theo của loại đã cho
-
va_end:Thao tác này kết thúc việc truy cập danh sách đối số biến
Vì vậy, nếu chúng ta gọi các hàm như -;
- sum (5, 5, 2, 8, 9, 3)
- tối đa (3, 5, 9, 2)
- tối thiểu (6, 8, 5, 2, 6, 7, 9)
thì kết quả đầu ra sẽ là 27 (tổng của tất cả năm số), 9 (tối đa của ba số đã cho), 2 (tối thiểu của sáu số đã cho).
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Xác định một hàm sum (), điều này sẽ lấy cnt và số lượng đối số thay đổi
- xác định ap va_list
- khởi tạo ap bằng va_start (ap, cnt)
- n:=0
- để khởi tạo i:=0, khi i
- n:=n + đối số tiếp theo của va_arg (ap, int)
- tối đa:=hiện tại
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <stdio.h> #include <stdarg.h> int sum (int cnt,...) { va_list ap; int i, n; va_start(ap, cnt); n = 0; 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; va_start(ap, cnt); minimum = 99999; 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; va_start(ap, cnt); maximum = 0; 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)); }
Đầu vào
sum(5, 5, 2, 8, 9, 3) max(3, 5, 9, 2) min(6, 8, 5, 2, 6, 7, 9)
Đầu ra
27 9 2