Trước tiên chúng ta cần tìm hiểu về bảng kí tự ASCII
ASCII – tên đầy đủ là American Standard Code for Information Interchange – là một bảng mã chuẩn trao đổi thông tin Hoa Kỳ, bao gồm các kí tự và mã của chúng dựa trên bảng chữ cái Latin được dùng trong tiếng Anh hiện đại. Bảng mã này bao gồm 256 kí tự được đánh số hiệu thập phân từ 0 tới 255, thường được dùng để hiển thị văn bản trong máy tính và các thiết bị thông tin khác. Các kí tự mà chúng ta sử dụng trong lập trình đều nằm trong bảng mã này. Để làm việc dễ dàng trên máy tính, mỗi kí tự đều được mã hóa bởi những bit nhị phân 0 – 1 và quy đổi ra giá trị thập phân tương ứng để người dùng dễ thao tác hơn. Ví dụ, kí tự A có số hiệu thập phân là 65, kí tự z có số hiệu là 122,…
Trong bảng mã ASCII có những kí tự in được và không in được. Trong chương này, chúng ta sẽ làm việc với các kí tự in được, nhiều nhất là các kí tự chữ cái và chữ số. Nếu muốn tìm hiểu kĩ hơn về bảng mã ASCII đầy đủ, bạn đọc có thể truy cập vào đường link sau:
https://vi.wikipedia.org/wiki/ASCII
Trong máy tính, thông tin được biểu diễn ở dạng số và dạng phi số. Chúng ta đã quá quen thuộc với thông tin dạng số, vậy còn dạng phi số? Đó là văn bản, hình ảnh, âm thanh,…Đối với lập trình, thông tin dạng văn bản cũng xuất hiện thường xuyên không kém dạng số, và các ngôn ngữ đều cung cấp những kiểu dữ liệu để lưu trữ thông tin dạng văn bản. Có hai loại dữ liệu dạng văn bản thường gặp nhất là kiểu kí tự (xâu C) và kiểu chuỗi kí tự (nhiều kí tự ghép lại với nhau – lớp string).
I. Kiểu xâu kí tự (xâu C)
Mảng với kiểu dữ liệu là char
- Mỗi biến đánh chỉ số là một kí tự
- Thêm một kí tự
'\0'
ở cuối mảng gọi là kí tự NULL, đánh dấu kết thúc xâu
Chú ý:
- Xâu kí tự khác với chuỗi kí tự: xâu kí tự có kí tự kết thúc xâu còn chuỗi kí tự thì không có.
- Xâu kí tự độ dài 1 khác với kí tự (“A” khác ‘A’)
- ‘A’ là một kí tự được lưu trữ trong 1 byte
- “A” là một xâu kí tự, ngoài kí tự ‘A’ còn có kí tự ‘\0’: được lưu trữ trong 2 bytes
Khai báo xâu kí tự
char tên_xâu [số_kí_tự_tối_đa];
Để lưu trữ một xâu có n kí tự chúng ta cần một mảng có kích thước n+1 – phần tử cuối cùng chứa ký tự NULL
Không nhất thiết phải điền toàn bộ phần tử của mảng
Ví dụ:
Để lưu trữ xâu “Tin hoc” chúng ta phải khai báo xâu có số phần tử tối đa ít nhất là 8
char str[10] = "Tin hoc";
Có thể bỏ qua kích thước của mảng
char str[] = "Tin hoc";
Truy nhập phần tử của xâu
Giống với truy nhập tới một phần tử của chuỗi kí tự
tên_xâu [chỉ_số_của_kí_tự]
Ví dụ:
char Str[10] = "Tin hoc";
![](https://vncode.tech/wp-content/uploads/2022/10/Anh7-1024x456.png)
Ví dụ: Nhập và đếm số kí tự ‘*’ của xâu
#include <bits/stdc++.h>
using namespace std;
char Str[100];
int main()
{
int d=0, i=0;
printf("Nhap xau ky tu: ");
gets(Str);
while(Str[i] != '\0')
{
if(Str[i]=='*')
d++;
i++;
}
printf("Ket qua : %d",d);
}
![](https://vncode.tech/wp-content/uploads/2022/10/Anh6.png)
![](https://vncode.tech/wp-content/uploads/2022/10/Anh5-1.png)
Chú ý:
Biến kiểu xâu C không giống các biến khác
- Không thể gán hay so sánh trực tiếp:
char aString[10];
aString = "Hello"; // KHÔNG HỢP LỆ!
- Chỉ có thể dùng “=“ khi khai báo kết hợp khởi tạo xâu C!
- Phải dùng hàm thư viện cho phép gán: strcpy(aString, “Hello”); đặt giá trị của aString bằng “Hello”
II. Chuỗi kí tự (Lớp chuẩn string)
Khai báo và truy nhập chuỗi
Giống với xâu kí tự, chỉ khác là không có kí tự NULL
Khai báo dưới dạng string {Tên_chuỗi};
và truy nhập như các kiểu dữ liệu khác
Ta không cần khai báo độ dài của chuỗi, mà mỗi khi thêm một kí tự vào thì string
sẽ tự động điều chỉnh độ dài của chuỗi cho vừa khớp với số lượng kí tự. Khi khai báo chuỗi, mặc định chuỗi đó sẽ là chuỗi rỗng (không có kí tự nào).
Các kí tự trong chuỗi sẽ được đánh số từ 0. Để truy cập một vị trí trong chuỗi (với điều kiện vị trí đó hiện đang có kí tự hoặc đã được khởi tạo), ta dùng cú pháp: {Tên_chuỗi}[{Vị_trí}]
Có thể gán, so sánh, cộng:
string s1,s2,s3;
s3 = s1 + s2; //nối
s3 = "Hello Mom!"; //gán xâu C "Hello Mom!" tự động chuyển sang kiểu string
Đọc/ghi với lớp string
Khi nhập xuất một biến chuỗi kí tự, ta có thể coi chuỗi đó như một biến đơn và sử dụng hai câu lệnh cin
và cout
để nhập xuất. Cú pháp như sau:
cin >> {Tên_biến_chuỗi}; // Nhập vào một biến chuỗi.
cout << {Tên_biến_chuỗi}; // Viết ra một biến chuỗi.;
Tuy nhiên, có một lưu ý khi sử dụng lệnh cin
đối với string
, đó là nếu như trong quá trình nhập liệu gặp phải dấu cách, thì việc nhập sẽ bị ngắt tại đó, cho dù người dùng có nhập thêm bao nhiêu kí tự đi chăng nữa thì chuỗi cũng sẽ chỉ lưu trữ phần ở phía trước dấu cách mà thôi. Ví dụ:
string name;
cin>>name;
Yêu cầu là nhập vào tên của bạn. Nếu bạn nhập vào một tên là Phan Việt Hoàng
thì khi chạy chương trình ta sẽ thu được name = "Phan"
Do đó trong trường hợp đọc vào một chuỗi có dấu cách ta cần phải sử dụng cú pháp getline()
Để đọc hết dòng người dùng gõ vào:
getline(cin, Tên_chuỗi);
Lệnh getline()
sẽ thu nhận cả dòng dữ liệu nhập vào, bao gồm cả những dấu cách. Nó sẽ dừng việc đọc lại khi gặp kí tự '\n'
- tức là kí tự xuống dòng:
Khi đó đoạn mã:
string name;
getline(cin, name);
Nếu nhập vào Phan Viet Hoang thì sẽ thu được name = "Phan Viet Hoang"