Lompat ke konten Lompat ke sidebar Lompat ke footer

Input Buffer Bahasa C dan Fungsinya

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.


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

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: Progam 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

Contoh: Pada kasus bahasa 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.

Baca Juga:

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.

Contoh:

// 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.

Contoh:

// 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.

Contoh:

// 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.

Contoh:

// 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

Fungsi Input Buffer:
  • Menunggu Input dari Pengguna: Ketika program meminta input dari pengguna, input buffer menyimpan data yang dimasukkan oleh pengguna sampai program membacanya.
  • Mencegah Kehilangan Data: Input buffer memastikan bahwa data yang dimasukkan tidak hilang atau terputus saat program sedang memprosesnya. Tanpa input buffer, program mungkin kehilangan data jika ia tidak siap untuk membacanya saat data tersebut diberikan.
  • Memungkinkan Pemrosesan yang Fleksibel: Dengan menggunakan input buffer, program dapat membaca dan memproses data pada kecepatan yang berbeda. Ini memungkinkan interaksi yang lebih fleksibel antara program dan pengguna, serta memungkinkan program untuk mengatur dan memanipulasi data sebelumnya sebelum memprosesnya lebih lanjut.
  • Menghindari Konsumsi CPU yang Tinggi: Dengan menggunakan input buffer, program dapat menunggu input tanpa harus terus-menerus memeriksa sumber input. Ini mengurangi beban CPU karena program tidak perlu terus-menerus aktif untuk menunggu input baru.
  • Memungkinkan Validasi Data: Sebelum memproses data dari input buffer, program dapat melakukan validasi untuk memastikan bahwa data yang dimasukkan sesuai dengan yang diharapkan. Ini membantu mengurangi risiko kesalahan dalam program dan meningkatkan keamanan.

Referensi Tambahan:

Artikel ini didedikasikan kepada: Dovan Ardy Setyawan, Dyas Sangga Anggita, Elisa Martha Hanum Basyaroh, Fadhil Subandrio, dan Firda Athaya Nadhirah.

12 komentar untuk "Input Buffer Bahasa C dan Fungsinya"

  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
  4. Saya menggunakan cin.ignore(numeric_limits::max(),'\n');
    Tetapi program malah menghasilkan error yang mengatakan umeric_limits was not declared the scope.
    Ada yang bisa bantu mengoreksi ?

    here's the program

    #include
    #include
    #include

    using namespace std;
    int main()
    {
    int a;
    char ch[80];

    // Masukkan input dari user
    // Contoh, angka 4
    cin >> a;
    cin.ignore(numeric_limits::max(),'\n');

    cin.getline(ch,80);

    cout << a << endl;
    cout << ch << endl;
    return 0;
    }

    BalasHapus
    Balasan
    1. Hi,
      Bentuk koreksi program adalah sebagai berikut (hapus ".h")
      #include

      Jika sudah, maka kode program akan berjalan secara sukses pada MS Visual Studio 2019, tetapi ada kemungkinan akan gagal jika digunakan pada tipe kompilator jenis lain.

      Hapus
  5. Kenapa permasalahan tersbut hanya muncul jika user ingin memasukkan string atau array karakter baru pada program?

    BalasHapus
    Balasan
    1. Ketika memasukkan sebuah nilai atau menekan tombol ENTER, maka cin akan menangkap nilai dan sebuah baris baru. Contoh, jika memasukkan angka 4, maka cin sebenarnya akan mendapatkan nilai string "4\n". Dari proses tersebut kemudian akan dilakukan ekstrak nilai ke variabel tipe numerik, yang akan membiarkan baris baru mengalami macet dari stream input. Kemudian ketika std::getline() membaca string baru, maka std::getline() akan melihat "\n" yang sudah terdapat pada stream, dan kemudian akan menafsirkannya sebagai string kosong yang telah dimasukkan! walaupun itu bukan maksud sebenarnya dari pembuatan program. Oleh karena itu, aturan praktisnya adalah melakukan penghapusan baris baru dari stream input, setelah membaca nilai dari console dengan std::cin.

      Hapus
  6. Saya menggunakan kode program yang menggunakan cin.sync() dan hasilnya tidak berfungsi, kenapa?

    BalasHapus
    Balasan
    1. Sama seperti readsome(), fungsi tersebut merupakan implementasi yang ditentukan apakah fungsi tersebut akan melakukan sesuatu dengan stream yang disediakan pada library. Tujuan dari fungsi tersebut adalah untuk mengambil perubahan apapun yang mungkin telah dibuat pada urutan input terkait dengan aliran buffer terakhir yang mengisi area get-nya. Untuk mencapai hal tersebut, maka sync() dapat mengosongkan area get, atau mungkin mengisi ulang, atau mungkin tidak melakukan apa-apa. Kondisi pengecualian adalah terjadi pada Visual Studio, dimana operasi ini akan membuang input yang belum diproses ketika dipanggil dengan stream standar input.

      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 -