- vừa được xem lúc

[C language] Variadic Function - Hàm Đối Ngẫu

0 0 27

Người đăng: Semi Dev

Theo Viblo Asia

Khái niệm hàm đối ngẫu variadic function được sử dụng để mô tả định nghĩa hàm có thể tiếp nhận số lượng đối số ngẫu nhiên, không cố định. Tính năng này được C hỗ trợ ở cấp độ cú pháp và các hàm hỗ trợ trong thư viện stdarg.h.

#include <stdio.h>
#include <stdarg.h> void simple_printf (char* $format, ...) { va_list $args; va_start ($args, $format); while (* $format != '\0') { if (* $format == 'i') { int $i = va_arg ($args, int); printf ("%i \n", $i); } else if (* $format == 'c') { char $c = va_arg ($args, char); printf ("%c \n", $c); } else if (* $format == 'f') { float $d = va_arg ($args, float); printf ("%f \n", $d); } $format += 1; } // -- while va_end ($args);
} void main (int $argc, char* $argv[]) { simple_printf ("icf", 9, 'a', 10.01);
}

Trong code ví dụ này, chúng ta đang có một hàm in danh sách các tham số được truyền vào chưa biết trước số lượng tại thời điểm viết định nghĩa. Để biết được kiểu dữ liệu của mỗi giá trị được truyền vào hàm, tham số đầu tiên được chỉ định là một chuỗi chứa các kí tự định dạng in và logic bên trong hàm đang hỗ trợ làm việc với các kiểu int, char, float. Trong code sử dụng tại hàm main, chúng ta có thể sử dụng số lượng đối số truyền vào tùy ý, miễn sao đảm bảo rằng mỗi một đối số đều có ký tự định dạng ở vị trí tương ứng trong mảng ký tự ở đối số đầu tiên.

In file included from main.c:2:
main.c: In function ‘simple_printf’:
main.c:14:35: warning: ‘char’ is promoted to ‘int’ when passed through ‘...’ 14 | char $c = va_arg ($args, char); | ^
main.c:14:35: note: (so you should pass ‘int’ not ‘char’ to ‘va_arg’)
main.c:14:35: note: if this code is reached, the program will abort
main.c:18:36: warning: ‘float’ is promoted to ‘double’ when passed through ‘...’ 18 | float $d = va_arg ($args, float); | ^
main.c:18:36: note: if this code is reached, the program will abort

À, như vậy là khi sử dụng tính năng này, kiểu kí tự char sẽ được lưu vào một biến trung gian kiểu int có động rộng lớn hơn, và tương tự float sẽ được lưu vào biến trung gian kiểu double có độ rộng lớn hơn. Như vậy chúng ta cần chỉnh sửa lại code theo gợi ý bởi trình biên dịch để chương trình có thể hoạt động được.

#include <stdio.h>
#include <stdarg.h> void simple_printf (char* $format, ...) { va_list $args; va_start ($args, $format); while (* $format != '\0') { if (* $format == 'i') { int $i = va_arg ($args, int); printf ("%i \n", $i); } else if (* $format == 'c') { int $c = va_arg ($args, int); printf ("%c \n", $c); } else if (* $format == 'f') { double $d = va_arg ($args, double); printf ("%f \n", $d); } $format += 1; } // -- while va_end ($args);
} void main (int $argc, char* $argv[]) { simple_printf ("icf", 9, 'a', 10.01);
}

Kết quả:

9 a 10.010000 

Qua ví dụ này, để tổng quát hóa cho các trường hợp sử dụng khác, tham số đầu tiên nên là một mảng chứa các chuỗi mô tả tên định kiểu dữ liệu của các giá trị được truyền vào cụ thể là bool, char, int, double, struct v.v...

Bình luận

Bài viết tương tự

- vừa được xem lúc

4 đặc tính của lập trình hướng đối tượng (Object oriented program)

Lập trình hướng đối tượng quá quen thuộc rồi bạn nào học lập trình đều phải học, đi phỏng vấn cũng vậy hỏi suốt(chắc cái này tùy vào vị trí tuyển dụng chủ yếu junior chắc chắn sẽ hỏi).nó là nền tảng cho hầu hết các design pattern hiện nay.

0 0 46

- vừa được xem lúc

Khác nhau giữa abstract class và interface khi nào dùng chúng

Nhắc đến Interface và abstract class hãy nhớ 2 từ này khá clear rồi, Khi sử dụng Interface là bạn Implement còn sử dụng abstract class là bạn extend. . Interface:. .

0 0 41

- vừa được xem lúc

Chuyện con vịt, cái máy bay và cu Tèo đọc báo

Chuyện con vịt, cái máy bay và cu Tèo đọc báo. Người đọc tự chịu trách nhiệm về tính xác thực của bài viết.

0 0 66

- vừa được xem lúc

Kinh nghiệm làm việc với Cgo

Kinh nghiệm làm việc với Cgo. Cuối tuần vừa rồi mình có làm một project nho nhỏ để học hỏi thêm, điểm khá thú vị là project này tuy không to lắm nhưng lại chứa khá là nhiều vấn đề và buộc mình phải tì

0 0 50

- vừa được xem lúc

Cách xây dựng cấu trúc dữ liệu Stack và Queue.

Mở đầu. Hello các bạn, hôm nay mình sẽ chia sẻ với các bạn cách để có thể tự xây dựng 2 loại cấu trúc dữ liệu stack(ngăn xếp) và queue(hàng đợi) sử dụng mảng trong C++;.

0 0 43

- vừa được xem lúc

Lập trình socket, giao tiếp client và server bằng ngôn ngữ C (với giao thức TCP)

Lập trình mạng là gì. Lập trình mạng là một trong những nhiệm vụ căn bản để phát triển các ứng dụng.

0 0 164