Cần phân tích câu lệnh scanf

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.

Í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);:

  1. %*[\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.

  1. %[^\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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?