Lompat ke konten Lompat ke sidebar Lompat ke footer

Penggunaan fflush(stdin) Bahasa C dan Fungsinya

Dalam bahasa pemrograman C, fflush(stdin) adalah sebuah pernyataan yang digunakan untuk membersihkan atau menghapus buffer input (stdin) dari sisa-sisa karakter yang mungkin masih tertunda. Artikel ini akan menjelaskan penggunaan dan pentingnya fflush(stdin) dalam bahasa C.


Sebelum lebih lanjut mempelajari materi tentang Penggunaan fflush(stdin) Bahasa C dan Fungsinya, terlebih dahulu pelajari materi tentang: Printf, Sprintf, dan Fprintf Bahasa C Beserta Fungsinya, Getc, Getchar, Getch, dan Getche Bahasa C Beserta Perbedaannya, dan Specifier %d dan %i Bahasa C dan Fungsinya.

Menghapus Buffer Input

Salah satu penggunaan utama dari fflush(stdin) adalah untuk menghapus atau membersihkan buffer input (stdin) dari karakter-karakter yang tersisa. Hal ini berguna ketika ingin membersihkan buffer setelah menerima input dari pengguna untuk menghindari karakter yang tidak diinginkan atau tidak terduga memengaruhi operasi input-output selanjutnya.

Mencegah Kesalahan dalam Input Berulang

fflush(stdin) sering digunakan setelah menggunakan fungsi-fungsi input seperti scanf() atau fgets(), terutama ketika input berulang diperlukan dalam sebuah loop. Tanpa menggunakan fflush(stdin), buffer input mungkin masih berisi sisa-sisa karakter dari input sebelumnya, yang dapat menyebabkan kesalahan atau perilaku yang tidak diinginkan dalam pengambilan input selanjutnya.

Penanganan Masalah dengan Buffering stdin

Buffering stdin adalah praktek yang umum dilakukan oleh sistem operasi untuk menyimpan sementara data input sebelum data tersebut diproses lebih lanjut. Namun, dalam beberapa situasi, seperti saat menggunakan fungsi input non-buffered seperti getchar(), karakter tambahan dapat tetap berada dalam buffer, yang dapat mengganggu operasi input-output selanjutnya. Penggunaan fflush(stdin) membantu dalam menangani masalah ini dengan membersihkan buffer input.

Peringatan terhadap Undefined Behavior

Meskipun fflush(stdin) seringkali digunakan untuk membersihkan buffer input, perlu diperhatikan bahwa penggunaannya pada stdin adalah tidak didefinisikan dengan jelas oleh standar bahasa C. Oleh karena itu, penggunaan fflush(stdin) pada stdin dapat menghasilkan perilaku yang tidak terdefinisi atau tidak konsisten antara implementasi kompiler yang berbeda. Meskipun demikian, dalam praktiknya, banyak kompiler mengizinkan penggunaan fflush(stdin) untuk membersihkan buffer input.

Alternatif Penggunaan

Untuk menghindari undefined behavior, terutama jika ingin membuat kode yang lebih portabel, ada alternatif lain yang bisa digunakan, yaitu dengan membersihkan buffer input secara manual. Salah satu cara yang umum adalah dengan menggunakan loop untuk membaca dan membuang karakter-karakter yang tersisa di buffer input hingga mencapai karakter baru-baru ini ('\n' atau EOF). Meskipun ini membutuhkan lebih banyak kode, namun bisa lebih aman dan portabel.

fflush() umumnya digunakan hanya untuk output stream. Fungsinya adalah untuk membersihkan (atau flushoutput buffer dan memindahkan data buffer menuju console (dalam kasus stdout) atau disk (pada kasus file output stream). 

Berikut adalah contoh dari penggunaan sintak fflush.

Sintak: fflush(FILE *ostream);

Ostream merujuk pada output stream atau update yang recent yang operasinya tidak diinput, fungsi fflush membuat data apapun yang tidak tertulis untuk stream akan dikirim ke host environtment untuk ditulis sebagai file, jika tidak maka behavior tidak akan definsikan.

Sesuai dengan standar C, hal tersebut merupakan behavior yang tidak terdefinisi untuk menggunakan fflush(sdin). Namun demikian beberapa kompilator seperti Microsoft Visual Studio dapat memberikan akses untuk hal tersebut. Bagaimana cara menggunakannya pada kompilator? Ketika mengambil string input dengan spasi, buffer tidak akan dihapus untuk input selanjutnya dan menganggap input sebelumnya adalah sama. Untuk menyelesaikan permasalahan tersebut maka digunakan fflush(stdin) untuk membersihkan stream atau buffer.

Baca Juga:

Contoh:

// Program bahasa C untuk

// mengilustrasikan situasi

// dimana flush(stdin)

// dibutuhkan oleh kompilator

// saat ini

#include <stdio.h>

#include<stdlib.h>

 

int main()

{

char str[20];

int i;

 

for (i=0; i<2; i++)

{

scanf("%[^\n]s", str);

printf("%s\n", str);

// fflush(stdin);

}

 

return 0;

}

Input:
makan  
makandanmakan

Output:
makan
makan

Kode program sebelumnya hanya memberikan input tunggal dan mengembalikan nilai sama untuk input kedua. Alasan hal ini dapat terjadi karena nilai string telah disimpan pada buffer, artinya nilai stream belum dibersihkan dengan benar seperti yang diharapkan pada nilai string beserta spasi atau baris baru. Sehingga, untuk mengatasi situasi tersebut fflush(stdin) digunakan.

Contoh:

// Program bahasa c untuk

// mengilustrasikan

// flush(stdin).

 

// Program ini hanya bekerja

// secara efektif jika

// dikompilasi pada kompilator

// tertentu seperti Microsoft

// visual studio.

#include <stdio.h>

#include<stdlib.h>

 

int main()

{

char str[20];

int i;

 

for (i = 0; i<2; i++)

{

scanf("%[^\n]s", str);

printf("%s\n", str);

 

// Digunakan untuk

// membersihkan buffer dan

// melewatkan string

// selanjutnya

fflush(stdin);

}

 

return 0;

}

Input:
makan
makandanmakan

Output:
makan
makandanmakan

Meskipun dapat menggunakan "fflush(stdin)" setelah statement "scanf()" juga dapat melakukan pembersihan pada beberapa kompilator, sangat tidak direkomendasikan untuk menggunakannya sebagai behavior tidak terdefinisi oleh bahasa standar.

Penggunaan fflush(stdin) dalam bahasa C memiliki beberapa kelebihan yang penting untuk dipertimbangkan:
  • Membersihkan Buffer Input: Salah satu kelebihan utama dari fflush(stdin) adalah kemampuannya untuk membersihkan buffer input (stdin) dari sisa-sisa karakter yang mungkin masih tertunda. Hal ini membantu menghindari karakter yang tidak diinginkan atau tidak terduga memengaruhi operasi input-output selanjutnya.
  • Mencegah Kesalahan dalam Input Berulang: Dengan menggunakan fflush(stdin) setelah menerima input dari pengguna, pengembang dapat mencegah terjadinya kesalahan dalam pengambilan input berulang, terutama dalam sebuah loop. Membersihkan buffer input setelah penggunaan fungsi input seperti scanf() atau fgets() membantu memastikan bahwa input berikutnya dimulai dari keadaan yang bersih.
  • Penanganan Masalah dengan Buffering stdin: Buffering stdin adalah praktik yang umum dilakukan oleh sistem operasi untuk menyimpan sementara data input sebelum data tersebut diproses lebih lanjut. Namun, dalam beberapa situasi, karakter tambahan dapat tetap berada dalam buffer, mengganggu operasi input-output selanjutnya. Dengan menggunakan fflush(stdin), pengembang dapat mengatasi masalah ini dengan membersihkan buffer input.
  • Fleksibilitas dalam Penggunaan: Meskipun penggunaan fflush(stdin) pada stdin tidak didefinisikan secara jelas oleh standar bahasa C, banyak kompiler mengizinkannya dalam praktiknya. Hal ini memberikan fleksibilitas kepada pengembang untuk menggunakan fflush(stdin) sebagai solusi sementara untuk membersihkan buffer input.
  • Kemudahan Implementasi: Penggunaan fflush(stdin) relatif mudah diimplementasikan dalam kode C. Cukup dengan memasukkan pernyataan fflush(stdin) setelah pemanggilan fungsi input, pengembang dapat memastikan bahwa buffer input bersih dan siap menerima input berikutnya.

Meskipun fflush(stdin) memiliki kelebihan-kelebihan tersebut, penggunaan perlu dipertimbangkan dengan hati-hati, terutama karena tidak semua kompiler atau lingkungan pengembangan mendukungnya dengan konsistensi. Oleh karena itu, penting untuk memastikan bahwa penggunaan fflush(stdin) sesuai dengan kebutuhan spesifik aplikasi dan dapat diandalkan dalam lingkungan pengembangan yang digunakan.

Penggunaan fflush(stdin) memang memiliki beberapa kelebihan, namun ada beberapa kekurangan yang perlu diperhatikan:
  • Tidak Didefinisikan dengan Jelas: Penggunaan fflush(stdin) pada stdin tidak didefinisikan secara jelas oleh standar bahasa C. Ini berarti perilaku dari penggunaan ini dapat bervariasi antara kompiler dan lingkungan pengembangan yang berbeda. Penggunaan yang tidak sesuai dengan standar dapat menyebabkan kode yang tidak portabel atau perilaku yang tidak terduga.
  • Undefined Behavior: Penggunaan fflush(stdin) pada stdin dapat menghasilkan perilaku yang tidak terdefinisi atau tidak konsisten, terutama di beberapa platform atau kompiler tertentu. Hal ini dapat menyebabkan ketidakstabilan dalam program atau bahkan crash jika tidak digunakan dengan hati-hati.
  • Tidak Cocok untuk Semua Situasi: Meskipun fflush(stdin) dapat membantu membersihkan buffer input dalam beberapa situasi, penggunaannya mungkin tidak cocok untuk semua kasus. Ada situasi di mana membersihkan buffer input dengan fflush(stdin) dapat mengakibatkan masalah, terutama jika tidak dilakukan dengan hati-hati.
  • Alternatif yang Lebih Aman: Meskipun fflush(stdin) umum digunakan dalam beberapa kasus, terutama dalam membersihkan buffer input setelah pemanggilan fungsi input seperti scanf() atau fgets(), terdapat alternatif yang lebih aman dan dapat diandalkan, seperti membersihkan buffer secara manual menggunakan loop dan fungsi-fungsi input yang sesuai.
  • Tidak Memperhitungkan Data Tertunda: fflush(stdin) hanya membersihkan buffer input yang belum diproses, sehingga karakter yang sudah diproses atau telah ditunda dalam proses input-output mungkin tidak terpengaruh. Ini dapat menyebabkan masalah jika data yang tertunda perlu dipertimbangkan dalam operasi input-output selanjutnya.

Dengan mempertimbangkan kekurangan-kekurangan ini, penting untuk menggunakan fflush(stdin) dengan hati-hati dan hanya dalam situasi yang tepat. Alternatif yang lebih aman dan lebih terdefinisi seperti membersihkan buffer input secara manual atau menggunakan pendekatan yang berbeda dalam desain program dapat menjadi pilihan yang lebih baik dalam beberapa kasus.

Kesimpulan

Meskipun penggunaan fflush(stdin) tidak didefinisikan secara jelas oleh standar bahasa C dan dapat menghasilkan perilaku yang tidak terdefinisi, namun dalam praktiknya, banyak kompiler mengizinkan penggunaannya untuk membersihkan buffer input. Penting untuk memahami tujuan dan risiko dari penggunaan fflush(stdin) serta mencari alternatif jika diperlukan, terutama jika kode perlu lebih portabel dan dapat berjalan di berbagai platform atau lingkungan pengembangan.

Referensi Tambahan:

Artikel ini didedikasikan kepada: Arvidhea Safira Gunawan, Dovan Ardy Setyawan, Dyas Sangga Anggita, Elisa Martha Hanum Basyaroh, dan Fadhil Subandrio.

9 komentar untuk "Penggunaan fflush(stdin) Bahasa C dan Fungsinya"

  1. Fungsi fflush(stdin) digunakan untuk membersihkan buffer keluaran dari stream. Fungsi tersebut mengembalikkan nilai nol, jika berhasil sebaliknya, maka akan mengembalikan EOF dan indikator error yang telah diatur.

    BalasHapus
  2. Bagaimana cara fflush bekerja pada bahasa C?

    BalasHapus
    Balasan
    1. Flush File Buffer atau fflush dalam bahasa C, merupakan fungsi yang digunakan untuk menulis data apapun yang tidak tertulis di buffer stream. JIka stream adalah petunjuk nol, maka fungsi fflush akan membersihkan semua stream dengan data yang tidak tertulis pada buffer.

      Hapus
  3. Kenapa fflush dapat bernilai salah pada bahasa C?

    BalasHapus
    Balasan
    1. stdin adalah variabel file standar yang menunjuk ke stream input yang biasanya digunakan untuk input keyboard, dimana fungsi dari fflush() dianggap sebagai "flush to buffer". Jadi, jika stream file adalah digunakan untuk input, seperti stdin, maka behavior-nya tidak dapat ditentukan, oleh karena itu tidak dapat diterima untuk menggunakan fflush() untuk menghapus inputan keyboard.

      Hapus
  4. Biasanya dalam dua programming terdapat dua tipe programmer dalam memahami program. Pertama mereka yang berpikir bahwa behavior tidak terdefinisi bukanlah suatu masalah besar, dan kedua adalah mereka yang menghabiskan waktu berhari-hari untuk mendebug kode program orang lain dan akhirnya baru menyadari bawah satu baris behavior tidak terdefinisi tersebut ternyata berpengaruh pada konfigurasi atau platform tertentu dari kompilator tertentu. :D

    Jika anda adalah orang yang mengabiskan waktu lebih dari 30 menit untuk memahami materi ini berarti anda termasuk katergori kedua,

    BalasHapus
  5. Program ini dapat bekerja dengan baik tanpa menggunakan fflush(). jika dikompilasi pada https://www.onlinegdb.com/online_c_compiler

    BalasHapus
  6. Program kedua yang menggunakan fflush(stdin), juga memberikan hasil output yang sama dengan program pertama yang tidak menggunakan fflush(stdin).

    BalasHapus
    Balasan
    1. Iya, kedua program dapat bekerja dengan baik pada kompilator berbasis offline.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -