Cara Membaca Input Pengguna di C dengan scanf

2

Konstanta itu nyaman. Mereka statis. Tapi mereka juga membosankan.

Sebuah program yang selalu menambahkan 5 dan 7 melakukan satu hal. Itu tidak beradaptasi. Itu tidak berinteraksi. Untuk membuat kode C benar-benar berguna bagi pengguna akhir, Anda harus menghentikan nilai hardcoding dan mulai mendengarkan.

Alat untuk pekerjaan itu adalah scanf.

Dari Hardcode ke Dinamis

Pada contoh sebelumnya, variabel a dan b kemungkinan besar diinisialisasi dengan angka tetap. Logikanya kaku. Outputnya dapat diprediksi. Jika Anda ingin mengubah penambahan, Anda harus mengedit kode sumber, mengkompilasi ulang, dan menjalankannya kembali.

Itu tidak ramah pengguna.

Untuk memperbaikinya, kita perlu menangkap masukan dari konsol. Pustaka standar menangani keluaran (printf ) dan masukan (scanf ). Peralihan dari konstanta ke nilai yang ditentukan pengguna mengubah program dari demo kalkulator menjadi utilitas sederhana.

Sintaks pemindaian

Berikut kode yang mewujudkannya:

Logikanya jelas. Itu linier.

  1. Program meminta bilangan bulat pertama.
  2. scanf menunggu masukan.
  3. Pengguna mengetikkan nomor dan menekan enter.
  4. Nilai disimpan di a.
  5. Ulangi untuk b.
  6. Tambahkan mereka.
  7. Cetak hasilnya.

Kebingungan Ampersand (&).

Titik kegagalan paling umum bagi pemula di sini adalah simbol &.

Lihatlah baris ini:
memindai("%d", &a);

Mengapa ada ampersand? Mengapa tidak scanf("%d", a); saja?

Variabel di C bukan sekedar nama. Itu adalah alamat memori. Saat Anda mendeklarasikan int a, Anda mencadangkan sebagian besar RAM. scanf tidak menginginkan nilai a karena a saat ini kosong (atau berisi sampah). scanf memerlukan alamat di mana ia dapat menulis nilai baru.

& adalah operator “alamat”. Ini memberikan scanf lokasi di memori sehingga dapat memodifikasi a secara langsung. Tanpanya, Anda mengarahkan scanf ke bagian memori acak. Program ini kemungkinan besar akan mogok, atau lebih buruk lagi, merusak data Anda.

Wawasan utama: printf menggunakan nilai. scanf membutuhkan alamatnya.

Penentu Format

Anda menggunakan %d di printf untuk menampilkan bilangan bulat. Anda harus menggunakan %d di scanf untuk membacanya.

Ketidakcocokan ini menyebabkan perilaku tidak terdefinisi. Jika Anda mencoba membaca bilangan bulat menggunakan %f (float), data akan diinterpretasikan secara salah. Tata letak memori float berbeda dari integer. scanf akan menulis bit mentah dari float

Cara scanf dan printf menangani variabel di C

Mengkompilasi dan menjalankan kode adalah tempat teori bertemu dengan kenyataan. Jika Anda melewatkan langkah ini, Anda hanya menebak-nebak. Fungsi scanf beroperasi mirip dengan printf mengenai format string, namun memiliki persyaratan input yang lebih ketat. Anda harus menempatkan operator alamat (& ) sebelum variabel bertipe char, int, float, dan struktur. Tanpanya, program akan terhenti.

Mengapa scanf memerlukan operator alamat

Tanda ampersand bukanlah sebuah pilihan. Ini memberitahu kompiler untuk menyimpan input langsung ke lokasi memori variabel. Jika Anda mengabaikannya, Anda memicu kesalahan runtime. Anda harus mencoba menghapusnya dengan sengaja. Melihat kecelakaan itu lebih mendidik dibandingkan membaca tentangnya. Ini menunjukkan dengan tepat betapa rapuhnya C ketika alamat memori salah dikelola.

Bagaimana printf memformat keluaran untuk pengguna

printf mengirim teks ke keluaran standar. Versi paling sederhana terlihat seperti ini:

Ini mencetak kata “Halo” tanpa baris baru. Bandingkan dengan:

\n menambahkan pengembalian pengangkutan. Itu mengakhiri garis. Tanpanya, keluaran berikutnya akan muncul di baris yang sama. Ini adalah detail kecil yang merusak keterbacaan jika diabaikan.

Cara menyematkan variabel dalam string printf

Untuk mengeluarkan nilai variabel, Anda menggunakan placeholder. Operator %d menggantikan dirinya sendiri dengan nilai integer variabel. Perhatikan contoh ini:

Anda dapat merangkai panggilan printf terpisah untuk menggabungkan teks dan variabel, namun ini tidak efisien:

Pendekatan yang lebih bersih menyematkan placeholder dalam string:

Beberapa placeholder juga berfungsi:

Jumlah placeholder harus sama persis dengan jumlah variabel. Jenisnya juga harus sesuai. Tiga penentu %d memerlukan tiga parameter int dalam urutan yang sama. Jenis atau jumlah yang tidak cocok menyebabkan perilaku tidak terdefinisi.

Placeholder mana yang menangani tipe C berbeda

printf mendukung tipe C standar melalui penentu format tertentu:

  • int menggunakan %d
  • float menggunakan %f
  • char menggunakan %c
  • string karakter menggunakan %s

Anda dapat menemukan dokumentasi terperinci dengan mengetik man 3 printf pada mesin UNIX. Kompiler lain menyediakan halaman manual atau file bantuan serupa.

Kesalahan umum C yang harus dihindari

Sensitivitas huruf sangat ketat. Printf atau PRINTF akan gagal. Itu harus huruf kecil printf.

  • Melupakan & di scanf menyebabkan runtime crash.
  • Jumlah parameter yang tidak cocok di printf atau scanf akan merusak keluaran.
  • Penggunaan variabel yang tidak dideklarasikan menyebabkan kesalahan kompilasi.

Men-debug masalah ini sering kali harus dilakukan dengan memeriksa sintaksis terlebih dahulu. Kompiler biasanya akan memberi tahu Anda dengan tepat di mana letak ketidakcocokan tersebut. Anda hanya perlu membaca pesan kesalahannya.