Trang chủ » Bài 3 – CIN/COUT trong C++
Lập trình C/C++

Bài 3 – CIN/COUT trong C++

cplusplus

Xin chào mọi người!

Bài viết hôm nay mình sẽ nói về định dạng nhập xuất trong C++. Có nhiều cách nhập xuất khác nhau, như từ bàn phím hoặc file. Bắt đầu từ những bài sau mình sẽ nói sâu hơn về C++, nên độ khó của nó cũng tăng theo. Các bạn có thắc mắc có thể comment phía bên dưới, mình sẽ đọc và reply 😀

Đối với nhập xuất bằng bàn phím, ta có cú pháp như sau:

// Nhập vào từ bàn phím

// 1 biến
cin >> var1;
// Nhiều biến
cin >> var1 >> var2 >> ... ;
// Hoặc
cin >> var1
    >> var2
    >> ...;

// Xuất ra từ bàn phím
cout << exp;
// Hoặc
cout << exp1 << exp2 << ...;
// Hoặc
cout << exp1
     << exp2
     << ...;

Với var1, var2,.. là các biến đã được khai báo, exp1, exp2,… là các biểu thức muốn xuất ra giao diện console. Các đối tượng cin, cout đã được định nghĩa trong , muốn sử dụng phải khai báo namespace std (standard – bài viết sau mình sẽ nói về namespace, các bạn cứ khai báo theo nhé). Toán tử >> (gọi là extraction operator) dùng để đẩy dữ liệu từ bên trái qua, ngược lại với nó là toán tử << (gọi là insertion operator).

Có vẻ hơi rắc rối nhỉ :D? Chúng ta cùng đến với 1 ví dụ nhé

#include <iostream>

using namespace std;
void main()
{
   int a, b = 5;
   cin >> a; // Nhập a
   cout << "Gia tri b = " << b; // Xuất Gia tri b = 5
}

Như mình nói ở trên, >><< đẩy dữ liệu theo hướng của nó. Chúng ta cùng xem lại ví dụ trên nhé:

  • Dữ liệu nhập từ bàn phím (cin) được đẩy qua a
  • Các dữ liệu “Gia tri b = ” và biến b được đẩy theo thứ tự từ phải qua về màn hình console (cout). Dữ liệu nào gần cout hơn sẽ được đẩy ra console trước

Ta cùng đến với 1 ví dụ tiếp theo nhé?

#include <iostream>
#include <string>
using namespace std;
void main()
{
   string str;
   cin >> str; // Nhập "Bai tap"
   cout << str;
}

Các bạn thấy điều gì lạ không? Màn hình console chỉ xuất “Bai”, sao lạ vậy?

Điểm đầu tiên, cin KHÔNG cho phép nhập dấu cách. Khi gặp dấu cách, cin sẽ coi như dấu kết thúc dữ liệu. Điều đó làm cho chuỗi “Bai tap” chỉ còn lại “Bai”. Vậy còn chuỗi “tap” ở đâu??? Ta xét lại ví dụ trên nhưng thêm vào vài chỗ nhé 😀

#include <iostream>
#include <string>
using namespace std;
void main()
{
  string str1, str2;
  cin >> str1; // Nhập "Bai tap"
  cout << str1; cin >> str2;
  cout << str2;
}

Các bạn thấy điều gì lạ không? Cin >> str2; không cho phép chúng ta nhập dữ liệu nữa, mà lại xuất thẳng ra “Baitap”. Vậy là sao nhỉ???

Thử tưởng tượng chuỗi “Bai tap” như 1 băng chuyền, ta hình dung lại đoạn code trên như sau:

"Bai" << "tap"

Như mình đã nói ở trên, cin xem dấu cách như dấu kết thúc dữ liệu, vậy nó sẽ tách chuỗi “Bai tap” thành 2 phần dữ liệu con. Các dữ liệu con nằm trong 1 “băng chuyền” mà ta gọi là bộ đệm (Buffer). Khi cin nạp dữ liệu vào biến, nó sẽ nạp theo tuần tự, cho nên chuỗi “Bai” sẽ vào trước. Điều đó làm cho bộ đệm chưa rỗng, tiếp theo lại là lệnh nạp dữ liệu vào biến, nhưng lần này đã có chuỗi kế tiếp là “tap” cho nên không thể truy nhập từ bàn phím như bình thường. Có rất nhiều cách để khắc phục, nhưng mình sử dụng cú pháp:

cin.ignore(streamsize n = 1, int delim = EOF);

Với n là số ký tự cần xoá trong buffer, delim là ký tự kết thúc việc xoá. Mình thường viết nó như thế này:

cin.ignore(INT_MAX, '\n');

Do không thể xác định chiều dài của buffer, nên mình chọn số lớn nhất (nói vậy chứ buffer chỉ chứa tối đa 2000 ký tự thôi :D), và kết thúc khi gặp ký tự xuống hàng (\n)

Quay trở lại vấn đề, nếu mình muốn khi nhập chuỗi kể cả khoảng trắng thì như thế nào? Đơn giản thôi, ta sử dụng câu lệnh:

getline(cin, string& str);

Trên đây là bài viết về CIN/COUT trong C++. Cảm ơn các bạn đã theo dõi!

Tags

About the author

Võ Hoài Sơn

Tính tình bất định
Chọc vào là bịnh
Rất yêu lập trình
Luôn code hết mình
Mình hiện đang là sinh viên của trường ĐH Khoa học tự nhiên TPHCM. Bản thân rất thích code, kiêm luôn cả mần thơ nên thường hơi hâm hâm dở dở. Ngoài ra chém gió, chém chuối, chém trái cây các kiểu cũng là sở trường của mình. Rất mong được làm quen với các bạn :D

Add Comment