Định dạng %n
specifier, khi được sử dụng trong một scanf()
dự kiến sẽ lưu trữ các đếm số ký tự của chuỗi định dạng đã được xử lý bởi các hàm thành một đối số kiểu int*
.Theo định nghĩa:Tại sao trình định dạng% n định dạng hoạt động bình thường đối với tất cả các lệnh scanf() nhưng lưu trữ một số ít hơn trong lệnh đầu tiên?
The number of characters of the format string already processed is stored in the pointed location.
Nhưng trong chương trình của tôi, nó hoạt động như vậy trong tất cả trừ scanf()
. Trong tất cả scanf()
s trong chương trình của tôi, ngoại trừ phần đầu tiên, nó lưu tổng số ký tự được nhập từ bảng điều khiển, bao gồm cả dòng mới (Nhập phím) .Trongđầu tiên, số đếm là một ít hơn tổng số ký tự và dòng mới được nhập từ bảng điều khiển.
Hãy giải thích sự bất thường này vì nó thực sự bực bội mà tôi không thể phát hiện lỗi đơn giản này.
#include <stdio.h>
int main()
{
int a,b,c,d,count;
printf("First Trial\n");
scanf("%d%d%d%d%n",&a,&b,&c,&d,&count); //OUTPUT ANOMALY HERE
printf("count=%d\n",count);
printf("Second Trial\n");
scanf("%d%n",&a,&count);
printf("count=%d\n",count);
printf("Third Trial\n");
scanf("%d%d%n",&a,&b,&count);
printf("count=%d\n",count);
printf("Fourth Trial\n");
scanf("%d%n%d",&a,&count,&b);
printf("count=%d",count);
}
Sample Output
First Trial
253
34
4
83
count=11
Second Trial
25
count=3
Third Trial
234
38
count=7
Fourth Trial
3534
35
count=5
Tại sao trong phiên tòa đầu tiên chúng tôi nhận được "11" thay vì "12? Đó là nghi ngờ của tôi.
CRUCIAL EDIT
Phát hiện khác.Nếu cho sốđầu tiên, thay vì sử dụng Enter
phím (dòng mới) để tách các số đã nhập, nếu tôi sử dụng khoảng trắng, nhiều khoảng trống, thì tất cả khoảng trắng đó cũng được tính bằng count
. Ví dụ: tôi có được count=21
. đang được xem xét.Nhưng tại sao lại là một ít hơn cho lần dùng thử đầu tiên?
First Trial
25 35 38 98
count=21
Nếu 'scanf() đầu tiên không tiêu thụ dòng mới được sử dụng để gửi đầu vào, thì bạn sẽ giải thích số đếm như thế nào ** 11 **? Không có gì khác mô tả tổng số ký tự là 8 (Các chữ số của tất cả các số cho lần quét đầu tiên() kết hợp) – Thokchom
Không có gì khác mô tả số đếm trong 'scanf()' s khác nếu chúng ta giả sử dòng mới không được tiêu thụ. – Thokchom
Trên thực tế là dòng được lấy từ Cplusplusreference.But Tôi biết những gì nó có nghĩa là mặc dù nó đã được viết sai cách .... Tôi biết nó có nghĩa là các ký tự đọc từ dòng đầu vào. – Thokchom