0Pricing
C Academy · Pelajaran

Jebakan Umum I/O

Masalah buffer dan baris baru.

Jebakan Umum I/O adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.

Kesalahan Umum Masukan/Keluaran

Masukan dan keluaran dalam C memiliki beberapa jebakan klasik. Dengan mengetahuinya, Anda dapat menghemat waktu berjam-jam untuk menelusuri kesalahan.

#include <stdio.h>
int main(void) {
    printf("Let us study I/O pitfalls\n");
    return 0;
}

Baris Baru yang Tersisa

Setelah scanf("%d", ...), tombol Enter meninggalkan \n di penyangga. %c berikutnya akan membaca baris baru tersebut, bukan masukan sebenarnya.

#include <stdio.h>
int main(void) {
    char c = 'A';
    printf("Use a space before %%c to skip the leftover newline\n");
    printf("c = %c\n", c);
    return 0;
}

Memperbaikinya dengan Spasi

Menulis scanf(" %c", &c) dengan spasi di awal memberi tahu scanf untuk melewati spasi kosong terlebih dahulu.

#include <stdio.h>
int main(void) {
    char c = 'Z';
    printf("scanf(\" %%c\", &c) skips whitespace\n");
    printf("c = %c\n", c);
    return 0;
}

Lupa Menambahkan Ampersand

Memberikan variabel kepada scanf tanpa & akan menyimpan data ke alamat yang salah dan kemungkinan besar menyebabkan program berhenti.

#include <stdio.h>
int main(void) {
    int n = 9;
    printf("Always pass &n, not n, to scanf for an int\n");
    printf("n = %d\n", n);
    return 0;
}

Penentu yang Tidak Cocok

Membaca double dengan %f, bukan %lf, dalam scanf akan merusak nilainya. Keluaran menggunakan %f untuk keduanya, tetapi masukan berbeda.

#include <stdio.h>
int main(void) {
    double d = 2.5;
    printf("scanf needs %%lf for double; printf uses %%f\n");
    printf("d = %.1f\n", d);
    return 0;
}

Penyanggaan Keluaran

Keluaran mungkin disangga dan tidak langsung muncul. Mengakhirinya dengan \n atau memanggil fflush(stdout) akan mengosongkan penyangga tersebut.

#include <stdio.h>
int main(void) {
    printf("Flushed by newline\n");
    fflush(stdout);
    return 0;
}

gets Berbahaya

Fungsi gets lama tidak memiliki pemeriksaan batas dan telah dihapus dari C modern. Sebagai gantinya, gunakan fgets.

#include <stdio.h>
int main(void) {
    char buf[10];
    /* fgets(buf, sizeof buf, stdin); */
    buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
    printf("buf = %s\n", buf);
    return 0;
}

Luapan Penyangga dengan %s

%s biasa dalam scanf dapat menulis melewati batas larik kecil. Batasi dengan lebar seperti %19s.

#include <stdio.h>
int main(void) {
    char name[20];
    printf("Use %%19s to leave room for the null terminator\n");
    name[0] = 0;
    printf("name length cap protects buffer\n");
    return 0;
}

fgets Menyimpan Baris Baru

fgets menyimpan baris baru di bagian akhir. Anda biasanya perlu menghapusnya.

#include <stdio.h>
#include <string.h>
int main(void) {
    char line[] = "hello\n";
    line[strcspn(line, "\n")] = 0;
    printf("[%s]\n", line);
    return 0;
}

Mengabaikan Nilai Balik

Tidak memeriksa nilai balik scanf berarti masukan yang salah diterima tanpa pemberitahuan. Selalu periksa.

#include <stdio.h>
int main(void) {
    int n = 3;
    int items = 1;
    if (items != 1)
        printf("bad input\n");
    else
        printf("ok: %d\n", n);
    return 0;
}

Menyatukan Semuanya dengan Aman

Pola yang kuat: baca dengan fgets, uraikan dengan sscanf, lalu periksa hasilnya.

#include <stdio.h>
int main(void) {
    char line[] = "123";
    int n;
    if (sscanf(line, "%d", &n) == 1)
        printf("parsed %d\n", n);
    return 0;
}

Pemeriksaan Singkat

Uji pemahaman Anda tentang masalah masukan/keluaran.

Ringkasan: Masalah Umum Masukan/Keluaran

Anda telah mempelajari cara menghindari kesalahan umum.

  • Baris baru yang tersisa mengacaukan %c; gunakan spasi di awal
  • Selalu berikan alamat dengan &
  • Gunakan %lf untuk membaca double
  • Utamakan fgets daripada gets dan batasi %s
  • Periksa nilai balik dan kosongkan penyangga keluaran

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Jebakan Umum I/O” gratis?

Ya — teks lengkap “Jebakan Umum I/O” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Jebakan Umum I/O”?

Masalah buffer dan baris baru. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C Academy?

Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Jebakan Umum I/O” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penentu Format printf
  2. scanf dan Input
  3. Lebar, Presisi, Flag
  4. Jebakan Umum I/O
← Kembali ke C Academy