Hàm sscanf
Hàm sscanf
dùng để đọc dữ liệu từ một chuỗi có thể xác định được định dạng của nó rồi truyền vào các đối số cần thiết. Nếu thành công, hàm trả về các giá trị của các đối số được truyền vào. Số lượng các giá trị được trả về có thể bằng với số lượng đối số cần lấy giá trị hoặc có thể ít hơn và thậm chí bằng không nếu xảy ra các lỗi tương ứng đối với các đối số. Nếu có lỗi xảy ra trước khi đối số đầu tiên được gán giá trị thì giá trị trả về sẽ là EOF
.
Cách sử dụng hàm sscanf
Muốn sử dụng hàm sscanf
rất đơn giản, chỉ cần tuân theo cấu trúc sau:
sscanf(const char* buffer, const char* format, argument, …)
buffer
buffer
là chuỗi dùng để truyền vào và yêu cầu sscanf
đọc hoặc có thể xem nó là một dữ liệu nguồn dùng để lấy các tài nguyên.
format
format
là chuỗi chứa một hay nhiều loại định dạng như:
- Các ký tự khoảng trắng : hàm sẽ đọc và bỏ qua các ký tự khoảng trắng mà nó gặp phải, bất kể số lượng khoảng trắng là bao nhiêu và khoảng trắng được thể hiện dưới dạng nào(space, tab,…).
Các ký tự khác ngoại trừ ký tự khoảng trắng và "%
": hàm sẽ đọc từng ký tự của chuỗibuffer
và kiểm tra xem nó có đúng với định dạng không. Nếu phù hợp hàm sẽ tự động đọc tiếp các ký tự tiếp theo. Nếu các ký tự được đọc được không phù hợp với định dạng mà nó được truyền vào thì hàmsscanf
sẽ gặp lỗi và trả về.
Định dạng đặc biệt: Một chuỗi được hình thành từ dấu "%
" mở đầu, được dùng để xác định kiểu và định dạng của dữ liệu mà muốn đọc. Các ký tự này tuân theo định dạng sau%[*][width][modifiers][type]
.%
(bắt buộc) : mở đầu chuỗi ký tự đặc biệt.*
(không bắt buộc): ký tự báo hiệu dữ liệu này được đọc nhưng bị bỏ qua không được lưu vào các đối số tương ứng.width
(không bắt buộc): số lượng ký tự tối đa được đọc.modifiers
(không bắt buộc): chỉ định một kích thước khác cho các dữ liệu được trỏ vào các đối số. Trong đó:h
:short int
(dành cho các kiểud
,I
vàn
),unsigned short int
(dànho
,u
vàx
).l
:long int
(dành chod
,i
vàn
), orunsigned long int
(dành choo
,u
vàx
), ordouble
(dành choe
,f
vàg
).L
:long double
(dành choe
,f
vàg
).
Các kiểu được đề cập ở trên, để hiểu rõ vui lòng xem ở mục type dưới đây:
- type: là một ký tự dùng để xác định kiểu của dữ liệu sẽ được đọc. Có các loại kiểu sau:
c
: một ký tự.d
: số nguyên hệ thập phân.e
,E
,f
,g
,G
:o
: số nguyên hệ bát phân.s
: chuỗi ký tự.p
: địa chỉ con trỏ.u
: số nguyên hệ thập phân không dấu.x
,X
: số nguyên hệ thập lục phân.[character]
: bất kỳ ký tự nào có xuất hiện trong dấu ngoặt vuông, có thể dùng dấu “-
“ để chỉ từ một số tới một số hoặc từ một ký tự tới một ký tự ví dụ như: [0-4], [abc].[^character]
: bất kỳ kí tự nào ngoại trừ ký tự có trong dấu ngoặt vuông.
argument
Ở đây, có thể truyền vào các đối số cần lấy giá trị, những đối số này nên lấy con trỏ nếu như muốn lưu trữ chúng bằng cách truyền tham chiếu cho nó.
Ví dụ
#include <iostream> int main() { int i, j; float x; int y; char str[] = "AmySS-1 70 21.05"; char str1[4]; char str2[4]; sscanf(str, "%3s%s%d%f", str1, str2, &i, &x); std::cout << "i = " << i << "\nx = " << x << '\n' << "str1 = " << str1 << '\n' << "str2 = " << str2; return 0; }