STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

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

    Hướng dẫn xây dựng hàm có tham số tuỳ ý trong C.
    Rye Nguyen

    Rye Nguyen

    03/08/2015
    19/09/2020
    2 phút đọc
    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.

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Đề xuất

      Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
      STDIO

      Trang chính

      Công ty TNHH STDIO

      30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn

      383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

      Đã thông báo Bộ Công Thương
      ©STDIO, 2013 - 2020