Getline trong c++ la gi

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 scanf hoặc cin, chương trình sẽ tự động bỏ qua các ký tự còn lưu trong bộ nhớ đệm (VD như " " hoặc "\n"), 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 getline để 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 Enter, 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ự Enter 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 cin.ignore(), fflush() hoặc flushall(). Ở đây mình hay sử dụng câu lệnh cin.ignore().

cin.ignore() 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 cin.ignore(so_luong, ky_tu), câu lệnh này sẽ xóa cho đến khi gặp ky_tu đầu tiên hoặc khi đủ so_luong 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 string.h.

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

  • Có phân biệt hoa thường:

Sử dụng strcmp(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 stricmp(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 strcmp() ở trên để so sánh.

Nối 2 chuỗi

Sử dụng strcat(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 string, đơn giản hơn chỉ cần thao tác cộng giống như toán học.

#include #include using namespace std; int main() { string a = "ok_"; a = a + "ket thuc"; cout << a; //in ra "ok_ket thuc" }

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

Sử dụng strstr(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ề NULL.

#include #include using namespace std; int main() { char a[] = "codelearn_hoctap"; char b[] = "learn"; cout << strstr(a,b); //in ra từ ký tự 'l' đến hết chuỗi }learn_hoctap

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.

Mình sẽ tiếp tục ra nhiều bài blog mới hơn, mong được sự đón nhận của các bạn đọc.