Rabu, November 20, 2019

Membersihkan input buffer pada bahasa C dan C++

Apa yang dimaksud dengan buffer?
Buffer adalah sebuah area penyimpanan sementara. Semua standar perangkat input dan output mengandung input dan output buffer. Pada standar bahasa C dan C++, stream juga merupakan buffer, sebagai contoh adalah pada input standar, ketika ditekan sebuah tombol pada keyboard, maka input tersebut tidak dikirim menuju program, melain mengalami penundaan (buffer) oleh sistem operasi hingga saat dimana input tersebut dialokasikan menuju program.

Bagaimana hal ini berdampak terhadap sebuah program?
Dalam beberapa kesempatan mungkin dibutuhkan pembersihan buffer yang tidak diperlukan untuk mendapatkan input selanjutnya dalam wadah yang diperlukan dan tidak dalam variabel sebelumnya pada buffer. Contohnya, pada kondisi dari C setelah bertemu dengan "scanf()" dan diperlukan input karakter array dari karakter, dan pada kondisi pada C++ setelah bertemu dengan statement "cin" dan dibutuhkan input karakter array atau sebuah string. Pada kondisi tersebut maka dibutuhkan pembersihan input buffer atau input lain yang dibutuhkan oleh buffer dari variabel sebelumnya, tidak pada container yang dibutuhkan. Ketika menekan tombol "enter" pada output screen setelah input pertama maka program akan melewatkan input untuk wadah atau container selanjutnya karena variabel buffer sebelumnya adalah ruang untuk wadah yang baru.

Contoh kasus pada bahasa C
Input:
GeeksforGeeks
a

Output:
GeeksforGeeks



Pada contoh kasus pada C++
Input:
4
GeeksforGeeks

Output:
4

Pada dua kode program tersebut, output tidak dicetak sesuai dengan kebutuhan. Alasannya adalah buffer sedang dalam kondisi sibuk atau sedang menampung nilai perintah lain. Karakter "\n" masih tersisa pada buffer dan dibaca sebagai input selanjutnya.

Bagaimana solusi untuk menyelesaikan permasalahan tersebut?

Pada kasus dari bahasa C:
satu, Dengan menggunakan "while((getchar())!='\n');": ketik "while((getchar()) !='\n');" membaca karakter buffer sampai akhir dari karakter (termasuk juga new line) dan menggunakannya setelah statement "scanf()" clear dari input buffer dan memberikan ijin input berada dalam wadah yang diinginkan.

Input:
GeeksforGeeks
a

Output:
GeeksforGeeks
a

dua, Dengan menggunakan "fflush(stdin)": ketik "fflush(stdin)" setelah statement "scanf()" dan bersihkan input buffer tetapi penggunaan metode ini dilarang pada bahasa c dan akan dianggap sebagai input stream tak terdefinisi sesuai Standar C++11.

Pada contoh kasus C++:
satu, gunakan "cin.ignore(numeric_limits::max(),'\n');": ketik "cin.ignore(numeric_limits::max(),'\n');" setelah statement "cin" membuat semua yang disimpan pada input stream termasuk newline.

Input:
4
GeeksforGeeks

Output:
4
GeeksforGeeks

dua, Menggunakan "cin.sync()": ketik "cin.sync()" setelah statement "cin" mengeluarkan semua yang masih tersisa pada buffer. Meskipun "cin.sync()" tidak bekerja pada semua implementasi menurut standar C++11.

Input:
4
GeeksforGeeks

Output:
4

tiga, Menggunakan "cin>>ws": ketik "cin>>ws" setelah statement "cin" untuk memberitahu kompilator untuk mengabaikan buffer dan juga untuk mengeluarkan semua ruang spasi sebelum konten sebenarnya dari string atau karakter array.

Input:
4
GeeksforGeeks

Output:
4
GeeksforGeeks





Related Posts

Membersihkan input buffer pada bahasa C dan C++
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "