Vì scanf
trả về giá trị EOF (là -1) ở cuối tệp, vòng lặp được viết là chính xác. Nó chạy miễn là đầu vào chứa văn bản khớp với %d
và dừng ở đầu hoặc cuối tập tin đầu tiên.
Nó đã có rõ ràng trong nháy mắt nếu scanf
mong đợi nhiều hơn một đầu vào ....
while (scanf("%d %d", &x, &y)==2) { ... }
sẽ thoát khỏi vòng lặp khi lần đầu tiên nó đã không thể để phù hợp với hai giá trị, hoặc do kết thúc của file cuối của tập tin (scanf
lợi nhuận EOF (đó là -1)) hoặc trên đầu vào phù hợp với lỗi (ví dụ như đầu vào xyzzy 42
không phù hợp %d %d
nên scanf
điểm dừng trên sự thất bại đầu tiên và trả về 0 mà không cần viết cho một trong hai x
hoặc y
) khi nó trả về một số giá trị nhỏ hơn 2.
Tất nhiên, scanf
là không phải bạn của bạn khi phân tích cú pháp đầu vào thực từ người bình thường. Có rất nhiều cạm bẫy trong việc xử lý các trường hợp lỗi.
Edit: Sửa một lỗi: scanf
lợi nhuận EOF
vào cuối tập tin, hoặc một số nguyên không âm đếm số lượng các biến nó thiết lập thành công.
Điểm quan trọng là vì bất kỳ giá trị khác 0 là TRUE
trong C, không kiểm tra giá trị trả về chính xác trong vòng lặp như thế này có thể dễ dẫn đến hành vi không mong muốn.Cụ thể, while(scanf(...))
là một vòng lặp vô hạn trừ khi nó gặp văn bản đầu vào không thể chuyển đổi theo định dạng của nó.
Và tôi không thể nhấn mạnh đủ mạnh rằng scanf
là không phải bạn của bạn. Một sự kết hợp của fgets
và sscanf
có thể là đủ cho một số phân tích cú pháp đơn giản, nhưng thậm chí sau đó nó dễ dàng bị áp đảo bởi các trường hợp cạnh và lỗi.
Vâng, trông khá dư thừa đối với tôi ... – tzaman