Dalam tutorial sebelumnya, kita telah membahas pengertian dan cara penulisan tipe data string dalam bahasa C. Karena tipe data string ini cukup sering dipakai, saya akan bahas sedikit tentang Cara Membaca String dengan scanf dan gets karena ada perbedaan yang cukup penting.
Membaca String dengan scanf
Di awal tutorial belajar bahasa C di duniailkom ini, kita pernah membahas tentang perintah scanf yang dipakai untuk meminta input dari user. Berikut contohnya:
#include <stdio.h> int main(void) { int harga; printf("Masukkan harga barang: "); scanf("%d",&harga); printf("\n"); printf("Harga barang adalah: %d", harga); printf("\n"); return 0; }
Cara yang sama juga bisa dipakai untuk tipe data string, seperti contoh berikut:
#include <stdio.h> int main(void) { char nama[20]; printf("Input nama: "); scanf("%s",nama); printf("\n"); printf("Selamat belajar %s \n", nama); return 0; }
Di baris 5 saya mendefinisikan sebuah variabel nama sebagai char nama[20]. Artinya, variabel nama bisa menampung 19 karakter (ingat, 1 karakter lagi menjadi jatah untuk null).
Di baris 7, perintah scanf dipakai untuk menerima inputan dari user. Inputan ini kemudian disimpan ke dalam variabel nama yang selanjutnya ditampilkan kembali dengan perintah printf di baris 10.
Meskipun nama "Andika" yang saya input tidak persis 19 karakter, ini tidak menjadi masalah selama panjang inputan tetap kurang dari 19 karakter.
Perhatikan juga bahwa di sini perintah scanf tidak butuh tanda '&' sebagaimana tipe data dasar seperti int, float dan char. Tanda '&' merujuk ke pointer yang berisi alamat memory dari variabel tersebut. Namun karena variabel nama adalah array of char, pointer ini tidak diperlukan.
Mari kita coba input dengan nama yang terdiri dari 2 kata:
Loh, apa yang terjadi? Kenapa kata "Putra" tidak terbaca?
Inilah keterbatasan dari perintah scanf ketika dipakai untuk membaca string. Pada saat scanf memproses karakter whitespace seperti spasi atau tab, proses pembacaan berhenti sampai di sana. Akibatnya, kata "Putra" tidak terbaca.
Untuk mengatasi masalah ini, kita bisa menggunakan fungsi gets.
Membaca String dengan gets
Gets adalah sebuah fungsi atau function di dalam bahasa C yang dipakai untuk membaca inputan user. Penggunaannya lebih sederhana daripada scanf, seperti contoh berikut:
#include <stdio.h> int main(void) { char nama[20]; printf("Input nama: "); gets(nama); printf("\n"); printf("Selamat belajar %s \n", nama); return 0; }
Di baris 6, terdapat perintah gets(nama), di sini user akan diminta untuk menginput sesuatu untuk disimpan ke dalam variabel nama.
Mari kita coba nama yang sama, yakni "Andika Putra":
Siip, sekarang sudah tidak ada masalah. Fungsi gets bisa membaca seluruh string, termasuk spasi sampai di tekan tombol Enter.
Dalam contoh kasus ini kita bisa melihat batasan dari perintah scanf. Untuk pembacaan tipe data string, sebaiknya gunakan fungsi gets daripada scanf.
Berikutnya, kita masih membahas seputar string dalam bahasa C, yakni Cara Mengubah Isi String dengan Fungsi strcpy.
Mas saya baca dari buku katanya gets() mempunya masalah dengan keaman,apakah itu benar?
Betul, fungsi gets() ada masalah di "buffer overflows". Dimana program bahasa C akan menampung semua inputan user berapapun besarnya. Misalnya get(a), kemudian user mengisi 1jt karakter ke dalam inputan a. Akibatnya program butuh 1MB memory tambahan (1 karakter = 1 byte).
Jika tidak mau pakai gets(), ada alternatif fgets() yang tidak memiliki masalah dengan buffer overflows, tapi memerlukan beberapa parameter tambahan.
Bagi pemula menurut saya bisa diabaikan saja (untuk sementara). Bahasa C biasanya hanya untuk belajar dasar programming (algoritma). Sudah sangat jarang bahasa C dipakai untuk membuat aplikasi yang sebenarnya, atau setidaknya nanti bisa pakai C++.
Materi seperti buffer overflow juga sedikit agak rumit, jika berminat bisa baca2 kesini: https://stackoverflow.com/questions/4346598/gets-function-in-c
min mengatasi gets yang membaca enter sebagai input bagaimana?
pakai fflush() mas
coba cek digoogle penulisanya, saya agak lupa soalnya
Min, biasanya bisa menggunakan scanf("%[^\n]s", &data). Apakah ada kekurangan dari input tersebut min?
// Program inputData.c
#include
// Fungsi main untuk memulai eksekusi program
int main()
{
// Deklarasi variabel x dan y dengan tipe data integer
int x;
int y;
// Mencetak output kalimat dan menginput variabel x dan y
// dalam satu statement dengan 2 digit field pada variabel x
printf([3] ………. , "Masukkan enam digit angka: \n");
[4] ………. ;
// Mencetak output variabel x dan y dalam satu statement
[5] ………. ("\nInteger yang di-input adalah %d dan %d\n", [6] ………. , [7] ………. );
} // Mengakhiri fungsi main()
kak tolong isiin kak saya kurang paham, masih pemula