Fungsi printf dan scanf dari <stdio.h> menggunakan format string berisi teks biasa dan conversion specifier yang dimulai dengan tanda %. Pemilih specifier yang tepat menentukan apakah nilai diterjemahkan sebagai integer, floating point, string, atau pointer—serta bagaimana nilai tersebut dirapikan (lebar, presisi, alignment). Bab ini berisi tabel lengkap specifier beserta modifier dan contoh output aktual yang dapat kita rujuk saat menulis kode.
Conversion Specifier Dasar #
Setiap specifier dimulai dengan % lalu diikuti satu huruf konversi. Tabel berikut mencantumkan specifier yang didukung C standar.
| Specifier | Tipe argumen | Output | Contoh |
|---|---|---|---|
%d / %i | int | Bilangan desimal bertanda | 42 |
%u | unsigned int | Bilangan desimal tak bertanda | 4294967290 |
%x | unsigned int | Heksadesimal lowercase | 2a |
%X | unsigned int | Heksadesimal uppercase | 2A |
%o | unsigned int | Oktal | 52 |
%c | int (char) | Karakter | A |
%s | char * | String null-terminated | Budi |
%f | double | Floating point desimal | 3.141593 |
%F | double | Sama seperti %f (uppercase NAN/INF) | 3.141593 |
%e | double | Notasi ilmiah lowercase | 3.141593e+00 |
%E | double | Notasi ilmiah uppercase | 3.141593E+00 |
%g | double | %e atau %f otomatis (yang lebih pendek) | 3.14159 |
%G | double | Sama seperti %g uppercase | 3.14159 |
%a | double | Heksadesimal floating point | 0x1.921f9f01b866ep+1 |
%A | double | Sama, uppercase | 0X1.921F9F01B866EP+1 |
%p | void * | Alamat pointer | 0x7ffea173a05c |
%n | int * | Menyimpan jumlah karakter tercetak | (side effect) |
%% | — | Literal % | % |
Length Modifier #
Modifier panjang ditempatkan di antara % dan huruf konversi, misalnya %ld untuk long. Modifier menentukan bagaimana argumen dibaca dari stack (atau register) sehingga ukuran yang benar dipakai.
| Modifier | Tipe argumen | Specifier |
|---|---|---|
| (none) | int, unsigned int | %d %u %x %o |
hh | char, unsigned char | %hhd %hhu |
h | short, unsigned short | %hd %hu |
l | long, unsigned long | %ld %lu %lx |
ll | long long, unsigned long long | %lld %llu %llx |
j | intmax_t, uintmax_t | %jd %ju |
z | size_t, ssize_t | %zd %zu |
t | ptrdiff_t | %td %tu |
L | long double | %Lf %Le %Lg |
Lebar, Presisi, dan Flag #
Kita dapat mengontrol tampilan dengan menempatkan flag, lebar minimum, dan presisi setelah %.
| Modifier | Bentuk | Efek |
|---|---|---|
Flag - | %-5d | Rata kiri (default kanan) |
Flag 0 | %05d | Pad dengan nol (hanya numerik) |
Flag + | %+d | Selalu tampilkan tanda + atau - |
Flag (spasi) | % d | Spasi untuk nilai positif, - untuk negatif |
Flag # | %#x, %#o | Tambahkan prefix 0x atau 0 |
| Lebar | %5d | Lebar minimum 5 karakter |
| Presisi | %.2f, %.5s | 2 desimal / maks 5 karakter string |
| Gabungan | %08.3f | Lebar 8, presisi 3, pad nol |
Program Lengkap #
Program berikut mendemonstrasikan specifier dasar, length modifier, lebar, alignment, dan presisi dalam satu output yang dapat kita pakai sebagai patokan.
/* File: fmt1.c - Format specifier untuk printf */
#include <stdio.h>
int main(void) {
int i = 42;
unsigned u = 4294967290u;
long l = 9000000000L;
long long ll = 9000000000000LL;
double d = 3.14159265;
char ch = 'A';
char *s = "Budi";
int *ptr = &i;
/* Specifier dasar */
printf("int : %d\n", i);
printf("unsigned : %u\n", u);
printf("long : %ld\n", l);
printf("long long : %lld\n", ll);
printf("hex : %x\n", i);
printf("HEX : %X\n", i);
printf("octal : %o\n", i);
printf("char : %c\n", ch);
printf("string : %s\n", s);
printf("double : %f\n", d);
printf("exp : %e\n", d);
printf("compact : %g\n", d);
printf("pointer : %p\n", (void*)ptr);
printf("percent : %%\n");
/* Lebar field dan alignment */
printf("[%5d]\n", i); /* lebar minimum 5, rata kanan */
printf("[%-5d]\n", i); /* rata kiri */
printf("[%05d]\n", i); /* pad dengan nol */
printf("[%+5d]\n", i); /* tampilkan tanda + */
printf("[% d]\n", i); /* spasi untuk positif */
/* Presisi untuk float */
printf("[%.2f]\n", d); /* 2 angka di belakang koma */
printf("[%.0f]\n", d); /* tanpa desimal */
printf("[%8.2f]\n", d); /* lebar 8, presisi 2 */
printf("[%-8.2f]\n", d); /* lebar 8 rata kiri */
/* Presisi untuk string */
printf("[%.3s]\n", s); /* hanya 3 karakter pertama */
/* Length modifier size_t */
size_t sz = 1024 * 1024;
printf("size_t : %zu\n", sz);
return 0;
}Compile dan jalankan:
gcc -std=c11 -Wall -Wextra -o fmt1 fmt1.c
./fmt1Output yang Dihasilkan:
int : 42
unsigned : 4294967290
long : 9000000000
long long : 9000000000000
hex : 2a
HEX : 2A
octal : 52
char : A
string : Budi
double : 3.141593
exp : 3.141593e+00
compact : 3.14159
pointer : 0x7ffea173a05c
percent : %
[ 42]
[42 ]
[00042]
[ +42]
[ 42]
[3.14]
[3]
[ 3.14]
[3.14 ]
[Bud]
size_t : 1048576Mari kita telaah baris-baris kode di atas:
- Baris 6-13 (
unsigned u = 4294967290udst.): Suffixu,L,LLwajib ditambahkan pada literal agar kompilator menafsirkan tipe literal dengan benar. TanpaLL, literal9000000000000dianggapintlalu menyebabkan overflow. - Baris 23 (
printf("hex : %x\n", i)):%xmencetak nilai integer dalam basis 16 lowercase. Untuk42desimal, hasilnya2a. Untuk output dengan prefix0x, gunakan%#x. - Baris 33 (
printf("[%+5d]\n", i)): Flag+memaksa tanda ditampilkan—berguna saat kolom angka positif dan negatif perlu sejajar.+hanya bekerja untuk tipe signed. - Baris 39 (
printf("[%.0f]\n", d)): Presisi0menghilangkan bagian desimal. Nilai3.14159265dibulatkan ke3(pembulatan ke terdekat, berbeda dengan cast(int)3.99yang membuang pecahan). - Baris 46 (
printf("size_t : %zu\n", sz)):size_tadalah tipe unsigned yang lebar 4 byte di 32-bit dan 8 byte di 64-bit. Specifier%zumemastikan format benar pada kedua platform.
Specifier untuk scanf #
scanf menggunakan specifier yang mirip, tetapi argumennya harus berupa pointer ke variabel yang akan diisi. Beberapa perbedaan penting: %c membaca satu karakter termasuk whitespace; %s berhenti di whitespace; %[...] membaca set karakter tertentu.
| Specifier | Membaca | Contoh |
|---|---|---|
%d | Integer bertanda | scanf("%d", &x) |
%u | Integer tak bertanda | scanf("%u", &u) |
%ld | long | scanf("%ld", &l) |
%f | float (bukan double!) | scanf("%f", &f) |
%lf | double | scanf("%lf", &d) |
%c | Satu karakter | scanf("%c", &ch) |
%s | String (stop di whitespace) | scanf("%9s", buf) |
%[0-9] | Hanya digit | scanf("%[0-9]", buf) |
%[^,] | Semua kecuali koma | scanf("%[^,]", buf) |