Chào mn,hôm nay em tình cờ thấy scanf khá lạ scanf("%*[\n] %[^\n]",a);
.
Mong có cao nhân nào đi qua phân tích câu lệnh đó dó cho e với ạ. Xin cảm ơn nhiều.
Cần phân tích câu lệnh scanf
Ít dùng thôi chứ đâu có gì lạ. Đặc tả có đủ hết. Gần giống với Biểu thức chính quy (Regex).
http://www.cplusplus.com/reference/cstdio/scanf/
Giải thích scanf("%*[\n] %[^\n]",a);
:
-
%*[\n]
:-
%
thì biết rồi, kí tự báo bắt đầu chuỗi định dạng. -
*
, theo đặc tả thì chuỗi định dạng sẽ thực hiện, nhưng không gán giá trị nhận được cho tham sốa
. -
[\n]
, chỉ nhận kí tự\n
.
-
=> Đọc hàng loạt kí tự xuống dòng và bỏ qua.
-
%[^\n]
:-
%
như trên. -
[^\n]
có thêm dấu mũ^
so với[\n]
, nhưng dấu mũ có nghĩa ngược lại, không chọn\n
. Nghĩa là đọc bất kì kí tự nào trừ kí tự xuống dòng.
-
=> Đọc toàn bộ một dòng văn bản.
Gom cả 2 lại thì được: đọc cho đến khi nào có dữ liệu (từ 1 kí tự) trên 1 dòng.
Ví dụ:
Dữ liệu 1
Dữ liệu 2
Đoạn trên có đến 3 dòng trống, câu lệnh scanf()
bạn đưa sẽ lấy dòng Dữ liệu 1
, bỏ qua 3 dòng trống.
4 Likes
Phân tích vậy thì đúng rồi. Mình chỉ bổ sung một chút là thật ra cụm %*[\n]
là bị dư. Vì khi có khoảng trắng ở chuỗi định dạng thì scanf
đã tự động loại bỏ các ký tự trống (bao gồm cả \n
).
Code sample: https://wandbox.org/permlink/JoMYALR84W0Ipr9o
3 Likes