Getline là gì

Chào các bạn, ở bài viết trước, chúng ta đã hiểu sơ bộ về kiểu ký tự rồi, ở bài viết lần này ta sẽ điểm mặt qua những hàm thường sử dụng cho kiểu ký tự và cũng như tìm hiểu về bộ nhớ đệm.

Bộ nhớ đệm

Bình thường, khi ta nhập 1 chuỗi ký tự hoặc số vào bàn phím, các chuỗi này sẽ được đẩy vào bộ nhớ đệm dùng cho việc lưu trữ trước khi được gán vào 1 biến.

Nếu ta dùng câu lệnh nhập

1  Ket thuc
3 hoặc
1  Ket thuc
4, chương trình sẽ tự động bỏ qua các ký tự còn lưu trong bộ nhớ đệm (VD như
1  Ket thuc
5 hoặc
1  Ket thuc
6), bởi vậy ta không cần quan tâm tới. Nhưng vấn đề phát sinh khi ta dùng câu lệnh
1  Ket thuc
7 để lấy chuỗi có khoảng trắng.

Khi thao tác với kiểu ký tự (char) có sử dụng khoảng trắng hay

1  Ket thuc
8, ta cần lưu ý xóa bộ nhớ đệm trước khi in ra màn hình. Việc quên xóa bộ nhớ đệm sẽ dẫn đến việc lưu trữ giá trị trong biến bị sai. VD như ở câu lệnh sau:

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.getline(b,100);      \\Nhập "codelearn"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
1  Ket thuc

Ở trên, chuỗi ký tự b không nhận được giá trị do bị ký tự

1  Ket thuc
8 có trong bộ nhớ đệm chèn vào.

Để có thể xóa bộ nhớ đệm, có thể sử dụng các câu lệnh

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
0,
int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
1 hoặc
int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
2. Ở đây mình hay sử dụng câu lệnh
int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
0.

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
0 là 1 phương thức của đối tượng cin trong C++. Câu lệnh này có tác dụng xóa ký tự đầu tiên trong bộ nhớ đệm.

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
1 kytu Ket thuc

Lưu ý: Nếu bộ nhớ đệm không có ký tự nào, nó sẽ xóa ký tự đầu tiên kế tiếp được nhập vào từ bàn phím.

int main() {
    char a[100];
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(a,100);      \\Nhập "kytu"
    cout << a;               \\In ra "ytu"
}
ytu

Hoặc ta có thể sử dụng cú pháp

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
5, câu lệnh này sẽ xóa cho đến khi gặp
int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
6 đầu tiên hoặc khi đủ
int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
7 ký tự.

Một số hàm thường sử dụng khi xài chuỗi

Tất cả hàm trong phần này đều thuộc thư viện

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
8.

Sao chép chuỗi

Sử dụng strcpy(chuỗi được sao chép, chuỗi sao chép).

#include 
#include 
using namespace std;
int main() {
    char a[100] = "chuoi";
    char b[100];
    strcat(b,a);
    cout << "Chuoi a: " << a << "\n";
    cout << "Chuoi b: " << b;
}
Chuoi a: chuoi
Chuoi b: chuoi

Lưu ý: khi sử dụng là kích thước chuỗi được sao chép phải lớn hơn kích thước ký tự có trong chuỗi sao chép, nếu không sẽ bị tràn bộ nhớ, dù vẫn nhập xuất được.

So sánh 2 chuỗi

Sử dụng

int main() {
    int a;
    char b[100];
    cin >> a;                \\Nhập vào 1, và xài Enter
    cin.ignore();            \\Xóa 1 ký tự trong bộ nhớ đệm
    cin.getline(b,100);      \\Nhập "kytu"
    cout << a << " " << b << " ";  
    cout << "Ket thuc";
}
9(chuỗi 1, chuỗi 2).

Chuỗi trả về 0 nếu 2 chuỗi bằng nhau, lớn hơn 0 khi ký tự ở vị trí khác nhau, ký tự ở chuỗi 2 lớn hơn chuỗi 1, hoặc ngược lại.

#include 
#include 
using namespace std;
int main() {
    char a[100] = "CHUOI";
    char b[100] = "CHUOI";
    char c[100] = "CHuOI";
    cout << strcmp(a, b) << endl;      //in ra 0
    cout << strcmp(a, c);              //in ra -1 vì 'U' < 'u'
}
  • Không phân biệt hoa thường.

Sử dụng

1 kytu Ket thuc
0(chuỗi 1, chuỗi 2).

Đây là hàm không chính thống nên không khuyên sử dụng. Thay vào đó bạn nên chuyển chữ hoa thành thường hoặc ngược lại, sau đó có thể sử dụng hàm

1 kytu Ket thuc
1 ở trên để so sánh.

Nối 2 chuỗi

Sử dụng

1 kytu Ket thuc
2(chuỗi cần thêm, chuỗi ký tự được thêm vào).

Lưu ý: chuỗi sau khi thêm vào không vượt quá số lượng phần tử của chuỗi được cấp phép để tránh bị tràn bộ nhớ.

#include 
#include 
using namespace std;
int main() {
    char a[100] = "ok_";
    strcat(a,"ket thuc");
    cout << a;                //in ra "ok_ket thuc"
}

Hoặc đối với biến

1 kytu Ket thuc
3, đơn giản hơn chỉ cần thao tác cộng giống như toán học.

1  Ket thuc
0

Tìm hàm chuỗi trong chuỗi

Sử dụng

1 kytu Ket thuc
4(chuỗi có sẵn, chuỗi cần tìm). Nếu tìm thấy, hàm sẽ trả về địa chỉ con trỏ đầu tiên trong chuỗi có sẵn có chứa chuỗi cần tìm, ngược lại sẽ trả về
1 kytu Ket thuc
5.

1  Ket thuc
1
1  Ket thuc
2

Kết

Đây là bài học về chuỗi ký tự trong c++, tưởng dễ mà khó, tưởng khó mà dễ, mong là bạn sẽ học được nhiều điều bổ ích trong bài viết này.

Khi nào dùng getline trong C++?

getline để lấy đến khi gặp ký tự xuống dòng. Đôi khi ta cần lấy cả ký tự khoảng trắng vào trong chuỗi (ví dụ nhập họ tên), lúc này cin không làm được, ta phải dùng getline.

Cin Ignore trong C++ là gì?

cin. ignore() 1 phương thức của đối tượng cin trong C++. Câu lệnh này có tác dụng xóa ký tự đầu tiên trong bộ nhớ đệm. Lưu ý: Nếu bộ nhớ đệm không có ký tự nào, nó sẽ xóa ký tự đầu tiên kế tiếp được nhập vào từ bàn phím.

Khoảng trắng trong C++ để làm gì?

Whitespace một thuật ngữ dùng để chỉ các ký tự cho mục đích định dạng trong khi viết code. Trong C++, các ký tự đó là khoảng trắng, dấu tab, và kí tự xuống hàng. Điều quan trong là khi biên dịch (compile), trình biên dịch sẽ bỏ qua các whitespace này, nhưng với một vài ngoại lệ.