C sebagai bahasa itu sangat kecil: tipe, operator, alur kontrol, fungsi, pointer. C tidak bisa mencetak, membaca file, membandingkan string, atau mengalokasikan memori. Semua itu adalah tugas pustaka standar: sekumpulan header yang disertakan oleh setiap implementasi yang sesuai standar.
Halaman ini adalah sebuah peta. Setiap bagian menjelaskan kegunaan sebuah header, menunjukkan satu contoh singkat yang bisa dijalankan, dan menunjuk ke halaman yang lebih lengkap jika ada.
stdio.h: Input dan Output
Header yang pertama kamu include di hampir setiap program. Isinya printf dan scanf, tipe FILE beserta fungsi-fungsi file, dan fungsi input per baris yang lebih aman.
Yang paling penting: printf, fprintf, sprintf, snprintf untuk output; scanf, fscanf, sscanf, fgets, getchar untuk input; fopen, fclose, fread, fwrite, fseek untuk file. Pembahasan lebih dalam ada di printf, scanf, dan penanganan file.
Satu aturan yang perlu diingat: jangan pernah memakai gets(). Fungsi ini tidak punya cara untuk mengetahui ukuran buffer-mu dan sudah dihapus dari standar sejak C11. Penggantinya adalah fgets(buf, sizeof buf, stdin).
stdlib.h: Utilitas Umum
Header serbaguna: memori, konversi, bilangan acak, kontrol proses, dan pengurutan.
Yang menonjol: malloc, calloc, realloc, free (lihat memori dinamis); atoi, atof, strtol, strtod untuk konversi, dan sebaiknya pilih keluarga strto* karena bisa melaporkan kegagalan, sementara atoi diam-diam mengembalikan 0; rand dan srand (lihat bilangan acak); exit, abort, getenv, system; serta qsort/bsearch.
string.h: String dan Blok Memori
String di C adalah array char yang diakhiri '\0', dan setiap operasi padanya adalah pemanggilan fungsi.
Dua kebiasaan menjaga header ini agar tidak menjadi sumber buffer overflow: selalu ketahui ukuran tujuan, dan ingat bahwa strcmp mengembalikan 0 jika kedua string sama, sehingga if (strcmp(a, b)) bernilai benar justru saat kedua string berbeda. Fungsi string membahas pola strncpy/snprintf yang lebih aman secara rinci.
math.h: Matematika
sqrt, pow, fabs, floor, ceil, round, fmod, keluarga fungsi trigonometri dan logaritma, INFINITY dan NAN.
Inilah satu-satunya header yang mungkin butuh flag linker: di Linux, tambahkan -lm di akhir perintah compile, atau linker akan melaporkan "undefined reference to sqrt". Tur lengkapnya ada di fungsi matematika.
time.h: Jam dan Tanggal
Dua offset di struct tm menjebak semua orang: tm_year dihitung dari 1900, dan tm_mon dimulai dari 0. time(NULL) juga merupakan seed yang biasa dipakai untuk srand.
ctype.h: Klasifikasi Karakter
Kecil, tetapi lebih berguna daripada kelihatannya. Setiap fungsinya menerima satu karakter dan menjawab pertanyaan ya/tidak, atau mengubah huruf besar dan kecil.
Set lengkapnya: isalpha, isdigit, isalnum, isspace, isupper, islower, ispunct, isxdigit, isprint, ditambah toupper dan tolower.
Perhatikan cast (unsigned char). Fungsi-fungsi ini didefinisikan untuk nilai yang bisa direpresentasikan sebagai unsigned char ditambah EOF. char biasa bersifat signed di sebagian besar sistem, jadi byte di atas 127 tiba sebagai bilangan negatif dan pemanggilannya menjadi undefined behavior. Cast ini tidak memakan biaya dan menghilangkan seluruh jenis masalah tersebut.
Selain itu, pilih fungsi-fungsi ini daripada pengecekan buatan sendiri. c >= '0' && c <= '9' kebetulan berhasil, tetapi isdigit(c) menyatakan maksudmu dengan jelas dan tetap benar di mana saja.
limits.h dan float.h: Batas Setiap Tipe
Seberapa besar sebuah int di mesin ini? Header-header ini menjawabnya, dan jawabannya adalah alasan kode yang portabel selalu bertanya alih-alih berasumsi.
INT_MAX adalah cara mengecek overflow sebelum terjadi. Ini penting karena overflow pada bilangan signed adalah undefined behavior, bukan wraparound yang bisa kamu uji sesudahnya.
stdbool.h dan stdint.h: Tipe yang Lebih Baik
C tidak punya tipe boolean sampai C99. <stdbool.h> menyediakannya:
bool, true, dan false adalah makro untuk _Bool, 1, dan 0, tetapi ketiganya membuat maksud kode jadi jelas. (Di C23 ketiganya menjadi kata kunci dan header ini tidak lagi diperlukan.)
<stdint.h> memberi tipe dengan lebar yang dijamin. Ini wajib untuk format file, protokol jaringan, dan apa pun yang embedded, di mana "sebuah int mungkin 32 bit" tidak cukup baik:
Makro bergaya PRId32 dari <inttypes.h> diekspansi menjadi specifier printf yang benar untuk setiap tipe dengan lebar tetap di platform saat ini. Itulah cara portabel untuk mencetaknya, karena %d benar untuk int32_t di beberapa sistem dan salah di sistem lain.
assert.h: Mengecek Asumsimu
assert(expr) tidak melakukan apa-apa jika ekspresinya benar, dan menghentikan program dengan sebuah pesan jika ekspresinya salah.
Compile dengan -DNDEBUG menghapus semua assertion, jadi tidak ada biayanya di build rilis. Itu juga peringatannya: jangan pernah menaruh efek samping di dalam assert. assert(read_next() > 0) berhenti membaca sama sekali di build rilis, dan bug yang muncul hanya terlihat di produksi.
Assertion ditujukan untuk kesalahan kamu sendiri: kondisi yang seharusnya mustahil jika kodenya benar. Input pengguna yang salah bukan urusan assertion; itu urusan if dan pesan error.
Sisanya, Secara Singkat
<stddef.h>:size_t,ptrdiff_t,NULL,offsetof<stdarg.h>: fungsi variadik, mesin di balikprintf<errno.h>:errnoditambahperrordanstrerroruntuk melaporkan kenapa sebuah pemanggilan gagal<signal.h>: menangani sinyal seperti Ctrl-C<setjmp.h>: lompatan non-lokal; jarang menjadi jawaban yang tepat<locale.h>,<wchar.h>,<wctype.h>: locale dan karakter lebar (wide character)<stdnoreturn.h>,<stdalign.h>,<threads.h>,<stdatomic.h>: tambahan di C11
Dua kebiasaan membuat library ini nyaman dipakai. Baca halaman manual sebelum menebak-nebak signature sebuah fungsi: man 3 strtol di macOS dan Linux itu otoritatif dan cepat. Dan cek nilai kembalian: malloc, fopen, dan strtol semuanya melaporkan kegagalan, dan program yang mengabaikannya akan gagal jauh belakangan dengan cara yang jauh lebih membingungkan.
Pertanyaan yang sering diajukan
Apa itu pustaka standar C?
Kumpulan fungsi, tipe, dan makro yang disediakan setiap implementasi C yang sesuai standar, dikelompokkan dalam sekitar 30 header. Isinya mencakup input dan output (<stdio.h>), memori dan konversi (<stdlib.h>), string (<string.h>), matematika (<math.h>), waktu, klasifikasi karakter, dan batas tipe numerik. C tidak punya I/O atau pengolahan string bawaan: semuanya berasal dari sini.
Apa perbedaan stdio.h dan stdlib.h?
<stdio.h> berisi input dan output: printf, scanf, fopen, fgets, FILE. <stdlib.h> berisi utilitas umum: malloc dan free, atoi dan strtol, rand dan srand, exit, qsort, bsearch. Program pada umumnya meng-include keduanya.
Apa fungsi ctype.h?
Header ini mengklasifikasi dan mengonversi karakter tunggal: isdigit, isalpha, isalnum, isspace, isupper, islower, ispunct, ditambah toupper dan tolower. Memakainya daripada perbandingan tulisan tangan seperti c >= '0' && c <= '9' lebih jelas dan benar untuk setiap locale dan set karakter.
Apakah saya perlu me-link sesuatu untuk memakai pustaka standar C?
Tidak, dengan satu pengecualian: fungsi matematika. Pustaka standar C di-link secara otomatis, tetapi di Linux implementasi <math.h> ada di library terpisah, jadi sqrt dan kawan-kawannya butuh -lm di akhir perintah compile. Selebihnya cukup #include yang tepat.