[ HTML ] [ Java ] [ Bahasa C ]


Minggu, Mei 02, 2021

Membersihkan Input Buffer pada Bahasa C dan C++

Pengertian Input 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.

Dampak Terhadap 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

// Program bahasa C untuk

// menjelaskan mengapa tidak

// membersihkan buffer input

// yang dapat menyebabkan

// output yang tidak

// diinginkan

#include<stdio.h>

 

int main()

{

char str[80], ch;

 

// Scan inputan dari user

// Contoh, "makandanmakan"

scanf("%s", str);

 

// Scan karakter dari user

// contoh, 'a'

ch = getchar();

 

// Cetak karakter array,

// cetak "makandanmakan"

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

 

// Hasil tidak ditampilkan

// karakter 'a'

printf("%c", ch);

 

return 0;

}

Input:
makandanmakan
a

Output:
makandanmakan

Pada contoh kasus pada C++

// Program bahasa C++ untuk 

// menjelaskan mengapa tidak

// membersihkan buffer input

// yang dapat menyebabkan

// output yang tidak

// diinginkan

#include<iostream>

#include<vector>

using namespace std;

 

int main()

{

int a;

char ch[80];

 

// Masukkan input dari user

// contoh , 4

cin >> a;

 

// Menerima inputan dari user

// contoh, "makandanmakan"

cin.getline(ch,80);

 

// Cetak angka 4

cout << a << endl;

 

// Cetak string : 

// Tidak dapat mencetak string

cout << ch << endl;

 

return 0;

}

Input:
4
makandanmakan

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.

Solusi Permasalahan

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.

// Kode program bahasa C untuk

// menjelaskan mengapa

// menambahkan "while

// ((getchar ())! = '\ N');"

// setelah pernyataan "scanf

// ()" dapat membersihkan

// buffer input

#include<stdio.h>

 

int main()

{

char str[80], ch;

 

// Scan input dari user,

// Contoh, "makandanmakan"

scanf("%s", str);

 

// input standar flush

// (bersihkan input buffer)

while ((getchar()) != '\n');

 

// Scan karakter dari user,

// contoh, 'a'

ch = getchar();

 

// Mencetak karakter array, 

// Mencetak "makandanmakan"

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

 

// Mencetak karakter tipe 

// char, 

// akan mencetak karakter 'a'

printf("%c", ch);

 

return 0;

}

Input:
makandanmakan
a

Output:
makandanmakan
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.

// Kode program bahasa C++

// untuk menjelaskan mengapa

// "cin.ignore(numeric_limits

// <streamsize>::max(),'\n');"

// dapat membersihkan buffer

// input

#include<iostream>

 

// untuk <streamsize>

#include<ios> 

 

// untuk numeric_limits

#include<limits>

using namespace std;

 

int main()

{

int a;

char str[80];

 

// Masukkan sebuah inputan

// dari user.

// contoh, karakter angka 4

cin >> a;

 

// bersihkan input buffer

cin.ignore(numeric_limits<streamsize>::max(),'\n');

 

// Mendapatkan hasil inputan

// dari user.

// contoh, "makandanmakan"

cin.getline(str, 80);

 

// Mencetak angka 4

cout << a << endl;

 

// Mencetak string : 

// Kode berikut akan mencetak

// nilai string secara

// langsung

cout << str << endl;

 

return 0;

}

Input:
4
makandanmakan

Output:
4
makandanmakan

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.

// Code program C++

// menjelaskan bagaimana "

// cin.sync();" dapat

// membersihkan input buffer

#include<iostream>

#include<ios> 

#include<limits>

using namespace std;

 

int main()

{

int a;

char str[80];

 

// Masukkan input dari user

// contoh, angka 4

cin >> a;

 

// Bersihkan input buffer

cin.sync();

 

// Mendapatkan inputan dari

// user.

// contoh, "makandanmakan"

cin.getline(str, 80);

 

// Cetak angka 4

cout << a << endl;

 

// Cetak string:

// Kode program ini akan

// mencetak nilai string

// secara langsung

cout << str << endl;

 

return 0;

}

Input:
4
makandanmakan

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.

// Kode program C++ untuk

// menjelaskan bagaimana "cin

// >> ws" membersihkan input

// buffer bersama dengan spasi

// kosong pada bagian awal

// dari string 

#include<iostream>

#include<vector>

using namespace std;

 

int main()

{

int a;

string s;

 

// Masukkan inputan dari user

// contoh, angka 4

cin >> a;

 

// Membersihkan input buffer

// dan spasi kosong pada

// bagian awal dari string

cin >> ws;

 

// Mendapatkan inputan dari

// user.

// contoh, "makandanmakan"

getline(cin, s);

 

// Mencetak angka '4' dan

// "makandanmakan" :

// akan mengeksekusi print 'a'

// dan 's'

cout << a << endl;

cout << s << endl;

 

return 0;

}

Input:
4
makandanmakan

Output:
4
makandanmakan

6 komentar:

  1. Bagaimana cara kerja buffer dalam bahasa pemrograman C?

    BalasHapus
    Balasan
    1. Bahasa C menggunakan buffer untuk output dan input variabel. Buffer menyimpan variabel yang seharusnya diambil atau dikirim dari suatu program pada bahasa C. Dalam penggunaannya, buffer yang digunakan harus dibersihkan terlebih dahulu sebelum menerima inputan berikutnya dari suatu program.

      Hapus
  2. Apa yang dimaksud dengan buffer input dalam bahasa pemrograman C?

    BalasHapus
    Balasan
    1. Jika mengacu pada penggunaan memori komputer, input buffer adalah lokasi yang menyimpan semua informasi yang masuk sebelum diteruskan ke CPU komputer untuk diproses. Input buffer juga dapat digunakan untuk mendeskripsikan buffer perangkat keras atau perangkat lunak lain yang digunakan untuk menyimpan informasi sebelum diproses komputer.

      Hapus
  3. Apa yang dimaksud dengan buffer output dalam bahasa pemrograman C?

    BalasHapus
    Balasan
    1. Output buffer adalah keluaran lokasi dalam memori atau chache dimana data disimpan hingga siap untuk dilihat oleh perangkat tampilan pada komputer.

      Hapus

Respon komentar 7 x 24 jam, so please be patient :D