Search…

Xây Dựng Hàm có Tham Số Tuỳ Ý trong C

Rye NguyenRye Nguyen
19/09/20202 min read
Hướng dẫn xây dựng hàm có tham số tuỳ ý trong C.

Yêu cầu

Đối với hàm có danh sách tham số tuỳ ý, các yêu cầu sau phải được thoả mãn:

  • Kiểu dữ liệu của 1 hoặc 1 vài tham số đầu tiên phải rõ ràng. Kiểu dữ liệu có thể là các kiểu dữ liệu cơ bản hoặc do người dùng tự định nghĩa trước khi xây dựng hàm.
  • Các tham số tiếp theo được thể hiện bằng dấu ba chấm “…”. Số lượng tham số là tuỳ ý, do đó phụ thuộc vào tham số đầu tiên để xử lý các tham số còn lại.

Cách làm trên là phổ biến, dễ hiện thực và có tính tái sử dụng cao. Tuy nhiên trong 1 số trường hợp, có thể không sử dụng tham số đầu tiên mà dùng 1 phương pháp nào đó, miễn là có thể đánh dấu và nhận biết thời điểm kết thúc danh sách tham số.

Xây dựng hàm

Trước tiên, để xây dựng hàm có danh sách tham số tuỳ ý, cần khai báo thư viện <stdarg.h>:

#include <stdarg.h>

Nguyên tắc xây dựng hàm như sau:

  • Định nghĩa 1 hàm với tham số cuối cùng là dấu ba chấm . 1 hoặc các tham số trước đó phải có dấu hiệu cho biết việc kết thúc của chuỗi tham số.
  • Khởi tạo biến va_list. Biến này được định nghĩa sẵn trong thư viện <stdarg.h>, dùng để lưu trữ danh sách tham số đầu vào.
  • Sử dụng macro va_start cùng với dấu hiệu nhận biết số lượng tham số và kiểu dữ liệu (thường là 1 biến int) để khởi tạo danh sách tham số.
  • Sử dụng macro va_arg và biến va_list đã khởi tạo để truy cập và trích xuất từng tham số.
  • Sử dụng macro va_end để giải phóng bộ nhớ đã cấp phát cho va_list.

Ví dụ minh hoạ

Ví dụ 1

Minh hoạ cho hàm tìm số lớn nhất trong các số nguyên. Đối số đầu tiên truyền vào hàm là số lượng các số nguyên sẽ truyền vào.

int FindMax(int _count, ...)
{
	va_list ap;
	va_start(ap, _count);

	int greater = va_arg(ap, int);

	for(int i = 1; i < _count; i++)
	{
		int val = va_arg(ap, int);
		greater = (greater > val) ? greater : val;
	}

	va_end(ap);
	return greater;
}

int main()
{
	int m = FindMax(7, 489, 2258, 5622, 7411, 892, 1045, 6081);
	printf("The greatest one is : %d\n", m);

	return 0;
}

Ví dụ 2

Minh hoạ việc in các chuỗi kí tự ra màn hình. Điều kiện nhận biết là kí tự NULL ở tham số cuối cùng.

void PrintLines(char* _firstStr, ...)
{
	char* str;
	va_list ap;
	va_start(ap, _firstStr);

	str = _firstStr;

	while(str != NULL)
	{
		printf("%s\n", str);
		str = va_arg(ap, char*);
	} 

	va_end(ap);
}

int main()
{
	PrintLines("STDIO", "Rye", "Welcome to www.stdio.vn", NULL);
	return 0;
}

Xem thêm về hàm printf và scanf tại Nhập Xuất Cơ Bản Trong C.

IO Stream

IO Stream Co., Ltd

developer@iostream.co
383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024