2013-05-18 29 views
5

Đị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 

Trả lời

7

trừ cái đầu tiên, nó sẽ lưu các số của tổng số ký tự nhập từ bàn điều khiển, bao gồm các dòng mới (Enter)

Bạn đang hiểu sai đó. scanf s làm không tiêu thụ các dòng mới cuối cùng được sử dụng để gửi đầu vào cho chương trình, do đó dòng mới được để trong vùng đệm được tiêu thụ bởi tiếp theoscanf. Tất cả trừ scanf đầu tiên tiêu thụ dòng mới từ đầu vào trước làm ký tự đầu tiên.

Đầu tiên scanf tiêu thụ tám chữ số cộng với ba dòng mới giữa bốn số, tạo thành 11 ký tự.

Thứ hai tiêu thụ dòng mới từ sau số thứ tư được đọc trong scanf đầu tiên, cộng với hai chữ số, tạo thành 3 ký tự.

Thứ ba: dòng mới, ba chữ số, dòng mới, hai chữ số: 7 ký tự.

Thứ tư: dòng mới, bốn chữ số: 5 ký tự.(Sau đó xuống dòng + 2 chữ số cho b)

Bằng cách này, báo giá của bạn

Số lượng ký tự của chuỗi định dạng đã được xử lý được lưu trữ trong các vị trí nhọn.

là không chính xác, nó không phải là số ký tự của chuỗi định dạng, nhưng số ký tự đọc từ input stream:

Đối số tương ứng sẽ là một con trỏ đến số nguyên ký vào đó được viết số ký tự được đọc từ luồng đầu vào cho đến nay bằng cuộc gọi này đến hàm fscanf.

+0

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

+0

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

+0

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