Cara kerja scanf di C: Input, Pemformatan, dan Kesalahan Umum

9

Masukan adalah sumber kehidupan dari setiap program interaktif. Tanpanya, Anda hanya menjalankan kalkulator dalam ruang hampa. Dalam bahasa pemrograman C, pekerja keras untuk mengambil data dari keyboard adalah scanf. Sederhana saja. Itu ada dimana-mana. Tapi mereka juga terkenal tidak kenal ampun ketika ada masalah.

Untuk skrip dasar atau prototipe cepat, scanf akan melakukan tugasnya. Bunyinya dari stdin (input standar). Jika Anda mengetik di keyboard, di situlah karakter Anda mendarat. Fungsinya serbaguna, tetapi tidak memiliki penanganan kesalahan yang kuat. Tidak masalah jika Anda mengetikkan huruf ketika ia mengharapkan angka. Itu hanya akan diam saja, atau lebih buruk lagi, membuat program Anda crash. Itu sebabnya ini bagus untuk tugas-tugas sederhana tetapi buruk untuk perangkat lunak tingkat produksi.

Sintaks dan Ampersand

Mari kita lihat kasus penggunaan yang paling sederhana. Anda ingin bilangan bulat. Anda memintanya. Anda menyimpannya.

memindai("%d", &b);

Itu saja. Dua argumen. String format dan target.

%d memberitahu scanf untuk mengharapkan bilangan bulat. Itu adalah placeholder yang sama yang Anda gunakan di printf. Variabel b harus dideklarasikan sebagai int. Jika tidak, Anda mencari masalah.

Inilah bagian yang selalu membuat pemula tersandung: ampersand (& ).

&b bukan salah ketik. Itu adalah sebuah penunjuk. Secara khusus, ini adalah alamat variabel b. scanf tidak mengambil nilai; ia memerlukan lokasi memori untuk menulis input. Lupakan &. Kode Anda mungkin dapat dikompilasi. Tapi kapan Anda menjalankannya? Menabrak. Kesalahan segmen. Ruang kosong. Program ini hampir pasti akan berhenti secara tiba-tiba karena mencoba menulis ke alamat memori acak.

Memformat Bendera

scanf menggunakan penentu konversi yang sama dengan printf. Jika Anda mengetahui yang satu, Anda mengetahui yang lainnya. Namun konteksnya penting.

  • Bilangan Bulat : %d
  • Angka floating-point : %f
  • Karakter tunggal : %c
  • String : %s

Jaga agar tetap lurus. Tukar %f dengan bilangan bulat dan Anda akan mendapatkan data sampah atau kerusakan.

Mengapa scanf Tidak Cukup

Anda dapat menyambungkan panggilan scanf untuk membaca beberapa nilai.

Ini berfungsi untuk angka. Itu cukup bersih. Tapi coba baca satu baris teks penuh? Itu rusak. scanf dengan %s berhenti di spasi pertama. Itu tidak membaca keseluruhan baris. Dan itu tidak menangani buffer overflow dengan aman.

Untuk program nyata, Anda harus menghindari scanf untuk input teks. Sebagai gantinya, gunakan gets (yang sudah tidak digunakan lagi dan berbahaya) atau, lebih disukai, fgets. Fungsi-fungsi ini membaca baris demi baris ke dalam buffer. Setelah Anda memiliki garisnya, Anda dapat menguraikannya. Anda dapat memeriksa kesalahan. Anda dapat memvalidasi bahwa masukan terlihat seperti angka sebelum Anda mencoba mengonversinya. scanf melewatkan langkah ini. Ini mengasumsikan Anda tahu apa yang Anda lakukan. Biasanya Anda tidak melakukannya.

Melanggar Sesuatu dengan Sengaja

Cara terbaik untuk mempelajari C bukanlah dengan membaca dokumentasi. Itu dengan merusak kompiler.

Ambil cuplikan ini:

Ubah itu. Membuatnya lebih buruk.

Hapus b dari deklarasi variabel. Saksikan kompiler berteriak tentang variabel yang tidak terdefinisi.

Hapus titik koma. Lihat bagaimana kesalahan sintaksis menyebar.

Hapus penjepit. Saksikan parser kehilangan akal sehatnya.

Hapus tanda kurung. Perhatikan kebingungannya