You are on page 1of 13

6.2.

Chuỗi ký tự
6.2.1. Khái niệm chuỗi ký tự
Chuỗi ký tự là tập hợp các ký tự được đặt trong dấu ngoặc kép, chúng cho phép chúng
ta biểu các từ, các câu thông báo, đoạn văn bản…

Trong C++ không có kiểu dữ liệu cơ bản để lưu các chuỗi ký tự. Để có thể làm được
điều này, chúng ta sử dụng mảng dữ liệu kiểu char. Vì dữ liệu kiểu char chỉ có thể lưu
được một ký tự đơn, do vậy mảng ký tự sẽ được dùng để tạo ra và lưu trữ chuỗi của các
ký tự đơn.

Ví dụ: Khai báo mảng ký tự có độ dài 20 như sau:

char str[20] ;

Mảng ký tự có tên là str kiểu char có thể lưu một chuỗi ký tự với độ dài cực đại là 20
ký tự. Chỉ số của các phần tử mảng chuỗi ký tự được đánh số từ 0 cho đến hết mảng.
Sau mỗi nội dung của một chuỗi ký tự, C++ sẽ tự bổ sung thêm một ký tự null (‘\0’) để
báo hiệu kết thúc chuỗi.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
T R U O N G D A I H O C \0

Để thao tác với mảng ký tự, chúng ta có thể sử dụng một số hàm sẵn có trong thư
viện cstring. Tuy nhiên, việc xử lý mảng ký tự bằng các hàm sẵn có này gặp phải một
số khó khăn do chúng ta phải quan tâm đến việc số lượng ô nhớ đã cấp phát cho mảng
ký tự hay việc phải đặt ký tự kết thúc vào cuối chuỗi sau khi xử lý . Ngoài việc thư
viện cstring để thực hiện các thao tác trên mảng ký tự, C++ cung cấp thêm một lớp
chuỗi (string class) để lưu trữ và xử lý chuỗi ký tự.

string là một lớp chuẩn mô tả về về chuỗi kí tự, nó cung cấp khả năng lưu trữ chuỗi kí
tự gọi và các hàm xử lý chuỗi kí tự mà nó đang lưu trữ.

Một ưu điểm mà lớp string đem lại cho chúng ta là các chuỗi ký tự có thể tự thay đổi
kích thước vùng nhớ cho phù hợp với yêu cầu về mặt lưu trữ chuỗi kí tự. Do đó, chúng
ta có thể tùy ý nối hoặc chèn thêm dữ liệu vào chuỗi ký tự cho đến khi dung lượng bộ
nhớ không đủ để cung cấp nữa.

6.2.2. Khởi tạo chuỗi ký tự


Các hàm khởi tạo chuỗi ký tự được đưa ra trong bảng 6.1 như sau:
Hàm Ý nghĩa Ví dụ
string objectName = value Khai báo và khởi tạo string str1 = "Xin Chao";
chuỗi ký tự
string objectName(stringValue) Khai báo và khởi tạo string str1 (“Xin Chao");
chuỗi ký tự
string objectName(str, n) Khai báo và khởi tạo string str1 (“Xin Chao");
chuỗi ký tự objectName string str2(str1, 4)
bởi một chuỗi con str Như vậy chuỗi str2 =
bắt đầu từ vị trí thứ n “Chao”
string objectName(str, n, p) Khai báo và khởi tạo string str1 (“Xin Chao");
chuỗi ký tự objectName string str2(str1, 4,2)
bởi một chuỗi con str Như vậy chuỗi str2 =
bắt đầu từ vị trí thứ n và “Ch”
chứa 2 ký tự
string objectName(n, char) Khai báo và khởi tạo string
chuỗi ký tự objectName str1(6,'a');
chứa n ký tự char Như vậy chuỗi
str1 = “aaaaaa”
Bảng 6.1. Các hàm tạo và khởi tạo chuỗi ký tự
Ví dụ 1:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1="Ngon ngu lap trinh C++";
string str2("Ngon ngu lap trinh C++");
string str3("Ngon ngu lap trinh C++",8);
string str4("Ngon ngu lap trinh C++",19,3);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << "str3: " << str3 << endl;
cout << "str4: " << str4 << endl;
return 0;
}
Kết quả của chương trình:
6.2.1. Nhập xuất chuỗi ký tự
Các hàm nhập, xuất chuỗi ký tự được đưa ra trong bảng 6.2 như sau:
Tên hàm Mô tả
cout Xuất dữ liệu lên màn hình
cin Nhập chuỗi ký tự từ bàn phím (không
nhập được ký tự trắng)
getline(cin, str) Hàm nhập một chuỗi ký tự từ bàn phím,
hàm cho phép nhập tất cả các ký tự kể cả
ký tự trắng, lưu trữ chúng trong str. Kết
thúc việc nhập khi nó nhận được một ký
tự xuống dòng
Bảng 6.2. Các hàm nhập xuất chuỗi ký tự

Ví dụ 2:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string hoten;
cout << "Nhap ho va ten:\n";
getline(cin, hoten);
cout << "Xau vua nhap: " << hoten << endl;
return 0;
}
Kết quả của chương trình:

Chú ý 1:
Khi dùng hàm getline(cin, str) để nhập chuỗi ký tự, chương trình sẽ chấp nhận và lưu
trữ các ký tự gõ vào từ bàn phím cho đến khi người sử dụng nhập ký tự Enter. Tất cả
các ký tự được nhập vào sẽ được lưu trữ ngoại trừ ký tự Enter. Ký tự Enter được coi
như ký tự kết thúc của việc nhập.
Ví dụ 3:
#include <iostream>
#include <string>
using namespace std;
int main(){
int n;
string str;
cout<<"Nhap mot so nguyen n: ";
cin>>n;
cout<<"Nhap mot xau ky tu: ";
getline(cin, str);
cout<<"So nguyen vua nhap: "<<n<<endl;
cout<<"Xau vua nhap: "<<str;
return 0;
}

Chú ý 2:
Trong ví dụ 3, câu lệnh cin>>n sẽ cho phép người sử dụng nhập một số nguyên từ bàn
phím, kết thúc việc nhập bằng cách nhấn phím Enter. Ký tự Enter sẽ được lưu trên
vùng đệm của máy tính. Khi câu lệnh getline(cin, str) được thực hiện, chương trình sẽ
lấy ký tự Enter từ vùng đệm và gán cho biến str. Như vậy, người sử dụng sẽ không
nhập được một chuỗi ký tự từ bàn phím nữa.
Để giải quyết vấn đề trên chúng ta có thể sử dụng hai cách:
- Cách 1: Sử dụng phương thức cin.ignore(n) để bỏ qua n ký tự trên vùng đệm. Xem ví
dụ 4.
- Cách 2: Sử dụng hàm getline(cin, str, kytuketthuc). Xem ví dụ 5.
Ví dụ 4:
#include <iostream>
#include <string>
using namespace std;
int main(){
int n;
string str;
cout<<"Nhap mot so nguyen n: ";
cin>>n;
cout<<"Nhap mot xau ky tu: ";
cin.ignore(1);
getline(cin, str);
cout<<"So nguyen vua nhap: "<<n<<endl;
cout<<"Xau vua nhap: "<<str;
return 0;
}

Ví dụ 5:
#include <iostream>
#include <string>
using namespace std;
int main(){
int n;
string str;
cout<<"Nhap mot so nguyen n: ";
cin>>n;
cout<<"Nhap mot xau ky tu: ";
getline(cin, str, '@');
cout<<"So nguyen vua nhap: "<<n<<endl;
cout<<"Xau vua nhap: "<<str;
return 0;
}
Ví dụ 6:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
cout<<"Nhap mot xau ky tu: ";
getline(cin,str);
cout<<"Xau vua nhap: "<<str<<endl;
cout<<"Xau vua nhap co do dai la: "
<<str.length()<<" ky tu";
return 0;
}

6.2.3. Xử lý chuỗi
Các hàm xử lý chuỗi được liệt kê trong bảng 6.3 như sau:
Hàm/Toán tử Mô tả Cách dùng
int length() Hàm trả về chiều dài của chuỗi string.length()
int size() Hàm trả về chiều dài của chuỗi string.size()
at(int index) Hàm trả về ký tự ứng với chỉ số string.at(4)
index
int compare(str) So sánh hai chuỗi ký tự. Trả về str1.compare(str2)
giá trị âm nếu chuỗi str1 nhỏ
hơn chuỗi str2; bằng 0 nếu hai
chuỗi bằng nhau; Trả về giá trị
dương nếu str1 lớn hơn chuỗi
str2.

c_str() Trả về một chuỗi rỗng string1.c_str()


bool empty Trả về giá trị đúng nếu chuỗi string1.empty()
rỗng; ngược lại trả về giá trị sai.
erase(k,n) Xóa n ký tự trong chuỗi bắt đầu string1.erase(4)
từ từ chỉ số k.
erase(k) Xóa tất cả các ký tự bắt đầu từ string1.erase(4)
từ chỉ số k đến hết chuỗi.
int find(str) Trả về chỉ số của sự xuất hiện string1.find("the")
đầu tiên của chuỗi str trong
chuỗi đang xét.
int find(str, k) Trả về chỉ số của sự xuất hiện string1.find("the",5)
đầu tiên của chuỗi str trong
chuỗi đang xét, vị trí bắt đầu tìm
kiếm là k
int find_first_of(str, k) Trả về chỉ số đầu tiên sự xuất string1.find_first_of("lt"
hiện của bất kỳ ký tự nào trong ,6)
str trong chuỗi hoàn thành, vị trí
tìm kiếm bắt đầu từ chỉ số k
int find_first_not_of(str, Trả về chỉ số đầu tiên sự xuất string1.find_first_not_of
ind) hiện của bất kỳ ký tự nào không ("lt",6)
nằm trong str trong chuỗi hoàn
thành, vị trí tìm kiếm bắt đầu từ
chỉ số k
void insert(k, str) Chèn chuỗi str vào chuỗi đang string.insert(4, "there")
xét tính từ vị trí thứ k
void replace(ind, n, str) Loại bỏ n ký tự trong chuỗi đang string1.replace(2,4,"oka
xét bắt đầu từ chỉ số k và chèn y")
chuỗi đang xét vào vị trí k.
string substr(k,n) Trả về một chuỗi con gồm n ký string2 =
tự từ chuỗi đang xét tính từ vị trí string1.substr(0,10)
k. Nếu n lớn hơn phần còn lại
của chuỗi thì chỉ nhận phần còn
lại đó trong chuỗi.
void swap(str) Đổi các ký tự trong chuỗi đang string1.swap(string2)
xét với chuỗi str
[k] Trả về một ký tự có chỉ số là x, string1[5]
không kiểm tra xem k có là chỉ
số kợp lệ không.
= Gán hai chuỗi string1 = string
+ Cộng hai chuỗi string1 + string2
+= Cộng và gán hai chuỗi
== != Các phép so sánh hai chuỗi string1 == string2
< <= string1 <= string2
> >= string1 > string2

Bảng 6.3. Các hàm xử lý chuỗi ký tự


Ví dụ 7: Ví dụ minh họa các hàm so sánh hai chuỗi ký tự compare(str), hàm chèn
chuỗi ký tự insert(k, str) và phép + nối hai chuỗi ký tự.

#include <iostream>
#include <string>
using namespace std;
int main(){
string str1 = "Ngon ngu lap trinh ";
string str2 = " C++ ";
cout<<"So ky tu trong xau 1: "<<str1.length()<<endl;
//So sanh hai xau ky tu bang ham compare(str)
int n = str1.compare(str2);
if(n<0) cout<<str1<<" nho hon "<<str2<<endl;
if(n==0) cout<<str1<<" bang "<<str2<<endl;
if(n>0) cout<<str1<<" lon hon "<<str2<<endl;
//Chen xau ky tu bang ham insert(k, str)
str1.insert(19, " bac cao ");
cout<<str1<<endl;
//Noi hai xau ky tu bang phep +
cout<<str1 + str2;
return 0;
}
Kết quả của chương trình:

Ví dụ 8: Ví dụ minh họa các hàm tìm kiếm find(str), hàm lấy chuỗi con từ chuỗi
đang xét substr(k,n), hàm đổi ký tự hai chuỗi swap()
#include <iostream>
#include <string>
using namespace std;
int main(){
string str1 = "Truong Dai Hoc Ky Thuat Cong Nghiep";
str1.erase(14, 9);
cout<<str1<<endl;
int n = str1.find("Cong Nghiep"); //Ham tìm kiem
cout<<"Vi tri xuat hien cua xau"<<"\""<<" Cong nghiep
"<<"\""
<<" trong xau str1 la: "<<n<<endl;
string str2 = str1.substr(7,7); //Ham lay xau con tu
xau me
cout<<"Xau str2: "<<str2<<endl;
str1.swap(str2); //Ham doi cac ky tu trong hai xau
cout<<"Xau str2: "<<str2;
return 0;
}

Ngoài các hàm xử lý chuỗi được cung cấp bởi lớp string, ngôn ngữ C ++ cung cấp
một số hàm thao tác trên ký tự như trong bảng 6.4:
Tên hàm Mô tả Ví dụ
int isalpha(charExp) Trả về giá trị Đúng (số nguyên khác isalpha('a')
0) nếu charExp là một ký tự chữ cái
latinh; trái lại, nó trả về giá trị Sai
(số 0)
int isalnum(charExp) Trả về giá trị Đúng nếu charExp là char ch;
một ký tự chữ hoặc ký tự số; trái lại, cin >> ch;
nó trả về giá trị Sai (số 0) isalnum(ch);
int isupper(charExp) Trả về giá trị Đúng nếu charExp là isupper('a')
một ký tự chữ in hoa; trái lại, nó trả
về giá trị Sai (số 0)
int islower(charExp) Trả về giá trị Đúng nếu charExp là islower('a')
một ký tự chữ in thường; trái lại, nó
trả về giá trị Sai (số 0)
int isdigit(charExp) Trả về giá trị Đúng nếu charExp là isdigit('a')
một ký tự số (từ 0 đến 9); trái lại, nó
trả về giá trị Sai (số 0)
int isascii(charExp) Trả về giá trị Đúng nếu charExp là isascii('a')
một ký trong bảng mã ASCII, trái
lại; nó trả về giá trị Sai (số 0)
int isspace(charExp) Trả về giá trị Đúng nếu charExp là isspace(' ')
một ký tự trắng; trái lại, nó trả về giá
trị Sai (số 0)
int isprint(charExp) Trả về giá trị Đúng nếu charExp là isprint('a')
một ký tự in được; trái lại, nó trả về
giá trị Sai (số 0)
int isctrl(charExp) Trả về giá trị Đúng nếu charExp là isctrl('a')
một ký tự điều khiển; trái lại, nó trả
về giá trị Sai (số 0)
int ispunct(charExp Trả về giá trị Đúng nếu charExp là ispunct('!')
ký tự ‘!’; trái lại, nó trả về giá trị Sai
(số 0)
int isgraph(charExp) Trả về giá trị Đúng nếu charExp là isgraph(' ')
ký tự in được khác ký tự trắng, trái
lại, nó trả về giá trị Sai (số 0)
int toupper(charExp) Trả về ký tự chữ in hoa nếu charExp toupper('a')
là ký tự chữ in thường; ngược lại nó
trả về đúng ký tự ban đầu.
int tolower(charExp) Trả về ký tự thường nếu charExp là tolower('A')
ký tự chữ in hoa; ngược lại nó trả về
đúng ký tự ban đầu.
Bảng 6.4 Các hàm thao tác trên ký tự
Ví dụ 9: Viết chương trình nhập một chuỗi ký tự từ bàn phím, đếm số ký tự chữ, ký tự
số và ký tự khác còn lại trong chuỗi.
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
char ch;
int demkt=0, demso=0, demkhac=0;
cout<<"Nhap mot xau ky tu: ";
getline(cin,str);
cout<<"Xau vua nhap: "<<str<<endl;
cout<<"Xau vua nhap co do dai la: "
<<str.length()<<" ky tu"<<endl;
for (int i = 0; i < int(str.length()); i++){
ch=str.at(i);
if(isalpha(ch)) demkt++;
else if(isdigit(ch)) demso++;
else demkhac++;
}
cout<<"So ky tu latinh: "<<demkt<<endl;
cout<<"So ky tu so: "<<demso<<endl;
cout<<"So ky tu khac: "<<demkhac;
return 0;
}
Kết quả của chương trình:

Ví dụ 10: Viết chương trình nhập một xâu ký tự từ bàn phím. Đổi các ký tự chữ trong
xâu thành ký tự hoa.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
string str;
cout << "Nhap mot chuoi ky tu: ";
getline(cin,str);
for (i = 0; i < int(str.length()); i++)
str[i] = toupper(str[i]);
cout << "Chuoi ky tu moi la: "<< str << endl;
cin.ignore();
return 0;
}
Kết quả của chương trình:

Các hàm nhập xuất ký tự cơ bản được liệt kê trong bảng 6.5 như sau:
Tên hàm Mô tả Ví dụ
cout.put(charExp) Đặt giá trị ký tự của charExp trên cout.put('A');
dòng xuất
cin.get(charVar) Lấy một ký tự từ dòng nhập và gán cin.get(key);
nó cho biến charVar
cin.peek(charVar) Gán ký tự từ dòng nhập cho biến cin.peek(nextKey);
charVar mà không lấy ký tự đó ra
khỏi dòng nhập
cin.putback(charExp) Đẩy một giá trị ký tự của charExp cin.putback(cKey);
vào trong dòng nhập
cin.ignore(n, char) Bỏ qua tối đa n ký tự trên dòng cin.ignore(5,
nhập hoặc bỏ qua các ký tự cho đến ‘\n’)
khi gặp ký tự char; Nếu hàm không
tham số thì sẽ bỏ qua một ký tự trên
dòng nhập
Bảng 6.5. Các hàm nhập xuất ký tự cơ bản
Ví dụ 11: Ví dụ minh họa chương trình sử dụng hàm cin.get(charVar)như sau:
#include <iostream>
using namespace std;
int main()
{
char ch;
cout << "Nhap mot ky tu: ";
cin.get(ch);
cout << "Ma ASCII cua ky tu "<<ch<<" la: " << int(ch);
return 0;
}
Kết quả của chương trình:
Ví dụ 12: Ví dụ minh họa chương trình sử dụng hàm cin.get(charVar) và hàm
cin.ignore()như sau:
#include <iostream>
using namespace std;
int main()
{
char ch1, ch2;
cout << "Nhap ky tu thu nhat: ";
cin.get(ch1);
cout << "Ma ASCII cua ky tu "<<ch1<<" la: "
<< int(ch1)<<endl;
cout << "Nhap ky tu thu hai: ";
cin.ignore();
cin.get(ch2);
cout << "Ma ASCII cua ky tu "<<ch2<<" la: " << int(ch2);
return 0;
}
Kết quả của chương trình:

You might also like