Pertanyaan Mengapa penentu format% n bekerja normal untuk semua pernyataan scanf () tetapi menyimpan yang kurang dalam yang pertama?


Itu %n penspesifikasi format, bila digunakan dalam scanf() diharapkan untuk menyimpan hitungan jumlah karakter dari string format yang sudah diproses oleh fungsi menjadi sebuah argumen tipe int*.Menurut definisi:

The number of characters of the format string already processed is stored in the pointed location.

Tetapi dalam program saya, itu berfungsi jadi semua tapi yang pertama scanf().Dalam semua scanf()Dalam program saya, tidak termasuk yang pertama, itu menyimpan hitungan jumlah karakter yang dimasukkan dari konsol, termasuk baris baru (Memasukkan kunci) .Tapi di pertama scanf(), hitungannya satu kurang dari jumlah total karakter dan baris baru yang dimasukkan dari konsol.

Tolong jelaskan anomali ini karena itu benar-benar membuat frustrasi karena saya tidak dapat mendeteksi bug sederhana ini.

#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);
}

Keluaran Sampel

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

Mengapa dalam percobaan pertama kita mendapatkan "11" bukannya "12? Itu keraguan saya.

EDIT KRITIS

Temuan lain. Jika yang pertama scanf(), daripada menggunakan Enter kunci (baris baru) untuk memisahkan angka yang dimasukkan, jika saya menggunakan spasi, banyak spasi, maka semua spasi tersebut dihitung oleh count juga. Misalnya saya dapatkan count=21.Ini berarti baris baru, spasi, semuanya sedang dipertimbangkan. Tapi mengapa demikian satu kurang untuk sidang pertama?

First Trial
25    35    38   98
count=21

5
2018-05-18 10:36


asal


Jawaban:


tidak termasuk yang pertama, ia menyimpan jumlah total karakter yang dimasukkan dari konsol, termasuk baris baru (Enter keys)

Anda salah mengartikan itu. Itu scanfs lakukan tidak mengkonsumsi newline akhir yang digunakan untuk mengirim input ke program, oleh karena itu baris baru yang tersisa di buffer untuk dikonsumsi oleh berikutnya  scanf. Semua kecuali yang pertama scanf mengkonsumsi baris baru dari input sebelumnya sebagai karakter pertama.

Pertama scanf mengkonsumsi delapan digit ditambah tiga baris baru di antara empat angka, yang membuat 11 karakter.

Yang kedua mengkonsumsi baris baru dari setelah angka keempat dibaca dalam yang pertama scanf, ditambah dua digit, membuat 3 karakter.

Yang ketiga: baris baru, tiga digit, baris baru, dua digit: 7 karakter.

Keempat: baris baru, empat digit: 5 karakter. (kemudian baris baru + 2 digit untuk b)

By the way, kutipan Anda

Jumlah karakter dari string format yang sudah diproses disimpan di lokasi yang ditunjuk.

tidak benar, bukan jumlah karakter dari string format, tetapi jumlah karakter yang dibaca dari aliran input:

Argumen yang sesuai harus berupa penunjuk ke   menandatangani integer yang harus ditulis jumlah karakter yang dibaca dari   aliran input sejauh ini dengan panggilan ini ke fungsi fscanf.


7
2018-05-18 10:46