• Chuỗi ký tự là một dãy gồm các ký tự hoặc một
mảng các ký tự được kết thúc bằng ký tự ‘\0’
• Các hằng ký tự được đặt trong dấu ngặc kép “”
• Ví dụ: Chuỗi “Chao ban”
37 trang |
Chia sẻ: lylyngoc | Lượt xem: 1748 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Chương 8: Chuỗi ký tự, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
C8: Chuỗi ký tự
1. Khái niệm
2. Khai báo
3. Các thao tác trên chuỗi
4. Con trỏ và các hàm trên chuỗi
1. Khái niệm
• Chuỗi ký tự là một dãy gồm các ký tự hoặc một
mảng các ký tự được kết thúc bằng ký tự ‘\0’
• Các hằng ký tự được đặt trong dấu ngặc kép “”
• Ví dụ: Chuỗi “Chao ban”
C h a o b a n
2. Khai báo
• Khai báo theo mảng
• Khai báo theo con trỏ
• Vừa khai báo vừa gán giá trị
Khai báo theo mảng
• Cú pháp:
char [chiềuDàiTốiĐa];
• Ví dụ:
char hoten[30];
Lưu ý:
• ChiềuDàiTốiĐa của biến là hằng số: 1 đến 255 byte.
• Số byte được cấp trong bộ nhớ để lưu biến là
ChiềuDàiTốiĐa + 1
Khai báo theo con trỏ
• Cú pháp:
char *;
• Ví dụ:
char *;
Bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ của biến con
trỏ
Vừa khai báo vừa gán giá trị
• Cú pháp:
char []=;
• Ví dụ:
char tenbai[]=“Nhat ky trong tu”;
3. Các thao tác trên chuỗi
• Nhập – xuất
• Truy xuất từng ký tự
Nhập – xuất
• Cú pháp:
Chờ nhận 1 ký tự từ bàn phím
Nhập vào biến st (st là mảng ký tự)
n-1 ký tự. Nếu nhập hơn thì số nhiều
hơn sẽ ở trên vùng đệm.
Nhập 1 ký tự từ bàn phím
Có thể dùng cin để nhập ký tự hoặc chuỗi ký tự
nhưng nó không cho phép nhập ký tự trắng hoặc
chuỗi có ký tự trắng.
cin.get();
cin.get;
cin.getline(st,n);
• cin.ignore(int n,‘\n’);
Bỏ qua tối đa n trong vùng đệm hoặc khi gặp phím enter
‘\n’ thì kết thúc cin.
• fflush(stdin);
• Số ký tự tối đa nhập được cho một biến là 127
Ví dụ
#include
#include
#include
#include
void main()
{
const int MAX=5;
char a[MAX], b[MAX];
clrscr();
cout<<"nhap mot chuoi”; cin.getline(a,5);
cin.ignore(100,'\n');
cout<<"nhap mot chuoi “;cin.getline(b,5);
cout<<a<<” “<<b;
getch();
}
abcdefgh
ijmonopq
abcd ijmo
Truy xuất từng ký tự trong chuỗi
• Do chuỗi là mảng ký tự, vậy có thể truy xuất chuỗi thông
qua chỉ số như truy xuất từng phần tử của mảng
Ví dụ
#include
#include
#include
int vowels(char str[]);
void main()
{
const int MAX=80;
char st[MAX];
clrscr();
cout<<"nhap mot chuoi";
cin.getline(st,MAX);
cin.ignore(100,'\n');
cout<<“so ky tu nguyen am la:“;
cout<<vowels(st);
getch();
}
int vowels(char str[])
{
int count=0,i=0;
while(str[i]!='\0')
{
switch(str[i])
{ case 'a':
case 'e':
case 'i':
case 'o':
case 'u':count++; }
i++;
}
return count;
}
Ví dụ
#include
#include
#include
void main()
{
const int MAX=80;
char st[MAX],c;
int i=0;
clrscr();
cout<<"nhap mot chuoi\n";
while(i<MAX&&(c=cin.get())!='\n')
st[i++]=c;
st[i]='\0';
cout<<"Chuoi vua nhap la: "<<st;
getch();
}
4. Con trỏ và các hàm trên chuỗi
• Con trỏ đặc biệt hữu ích trong việc xây dựng các
hàm xử lý chuỗi.
• Sử dụng con trỏ truy xuất chuỗi thay vì dùng chỉ
số thì chương trình sẽ cô đọng hơn
Ví dụ:
/* Dao nguoc chuoi */
#include
#include
#include
#include
char *dnchuoi(char *s)
{
char *tmp, i;
i = 0;
tmp = (char *)malloc(strlen(s)+1);
while (i<strlen(s))
*(tmp+i) = *(s + strlen(s) - i++ - 1);
*(tmp+i) = 0;
return tmp;
}
void main()
{
char hello[] = "Hello World";
char *s;
cout<<"\nChuoi ban dau = "<< hello;
s = dnchuoi(hello);
cout<<"\nChuoi dao nguoc = "<< s;
getch();
}
16
Các hàm thư viện xử lý chuỗi
#include
1. strcat: ghép chuỗi
char *strcat(char *s_nhan, char *s);
Bổ sung chuỗi s vào sau chuỗi s_nhan
2. strchr: Tìm lần xuất hiện đầu tiên của ký tự trong chuỗi
char *strchr(char *s, int kt);
Nếu có cho địa chỉ của ký tự, nếu không cho NULL
3. strrchr: Tìm lần xuất hiện cuối cùng của ký tự trong chuỗi
char *strrchr(char *s, int kt);
Nếu có cho địa chỉ của ký tự, nếu không cho NULL
17
Ví dụ
Dùng hàm strcat để ghép chuỗi.
#include
#include
#include
int main()
{
clrscr();
char s_nhan[50];
char *s1 = "TOI DI";
char *s2 = "XEM PHIM";
strcat(s_nhan, s1);
strcat(s_nhan, s2);
cout << s_nhan;
getch();
return 0;
}
Chương 3: Các thành phàn cơ
bản
18
Các hàm thư viện xử lý chuỗi
4. strcmp: So sánh 2 chuỗi (có phân biệt chữ hoa, chữ
thường)
int strcmp(char *s1, char *s2);
giá trị âm nếu chuỗi s1 nhỏ hơn chuỗi s2
giá trị 0 nếu chuỗi s1 bằng chuỗi s2
giá trị dương nếu chuỗi s1 lớn hơn chuỗi s2
5. strcmpi: So sánh 2 chuỗi (không phân biệt chữ hoa,
chữ thường)
int strcmpi(char *s1, char *s2);
19
Các hàm thư viện xử lý chuỗi
6. strcpy: sao chuỗi
char strcpy( char *s_nhan, *s_gui);
Cho chuỗi s_gui vào vùng s_nhan
7. strcspn: tìm độ dài đoạn đầu chuỗi
int strcspn(char *s, char *s_con);
Cho độ dài đoạn đầu của s, mà mọi ký tự của đoạn
không có mặt trong chuỗi s_con
8. strspn: Cho độ dài đoạn đầu của chuỗi
int strspn(char *s, char *s_con);
Cho độ dài đoạn đầu của s, mà mọi ký tự của đoạn đều
có mặt trong chuỗi s_con
20
Các hàm thư viện xử lý chuỗi
9. strdup:gấp đôi một chuỗi
char *strdup(char *s);
Cấp vùng nhớ để đặt 2 lần chuỗi s. Nếu thành công
hàm cho địa chỉ vùng này, nếu không hàm cho
NULL
10. strlen: độ dài của chuỗi
int strlen(char *s);
11. strlwr: chuyển chữ hoa thành chữ thường
char *strlwr(char *s);
Chương 3: Các thành phàn cơ
bản
21
Ví dụ:
strlen: Chiều dài xâu
#include
#include
#include
#include
int main(void)
{
char *string = "Khoa Cong Nghe Thong Tin";
cout << string; cout << '\n';
cout << "Co chieu dai la "; cout <<strlen(string);
getch();
return 0;
}
22
Các hàm thư viện xử lý chuỗi
12. strncat: ghép thêm n ký tự vào chuỗi
char *strncat(char *s_nhan, char *s,int n);
Ghép n ký tự đầu của s vào s_nhan
13. strncmp: so sánh n ký tự đầu của 2 chuỗi
int strncmp(char *s1, char *s2, int n);
14. strncpy: sao n ký tự đầu cho một chuỗi
char *strncpy(char *s_nhan, char *s_gui,int n);
Sao n ký tự đầu của s_gui sang s_nhan
15. strnset: gán n lần 1 ký tự cho 1 chuỗi
char *strnset(char *s, int c,int n);
23
Một số ví dụ
Dùng hàm strcat để ghép chuỗi.#include
#include
#include
int main(void)
{
char xaudich[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcat(xaudich, Borland);
strcat(xaudich, blank);
strcat(xaudich, c);
cout << xaudich;
getch();
return 0;
}
Có 3 chuỗi:
S1=“Borland”
S2=“ “
S3=“C++”
Dùng hàm strcat để có chuỗi: “Borland C++”
24
Các hàm thư viện xử lý chuỗi
16.strpbrk: tìm sự xuất hiện đầu tiên
char *strpbrk(char *s1, char *s2);
Tìm sự xuất hiện của s2 trong s1, nếu có trả về
địa chỉ của ký tự tìm thấy trong s1, nếu
không NULL
17.strrev: đảo ngược 1 chuỗi
char *strrev(char *s);
Đảo ngược chuỗi s.hàm cho địa chỉ chuỗi đã
đảo ngược.
25
Các hàm thư viện xử lý chuỗi18.strset: đặt 1 ký tự vào mọi vị trí của chuỗi
char *strset(char *s,int kt);
Thay mọi ký tự trong s bằng kt
19.strstr: tìm sự xuất hiện đầu tiên
char *strstr(char *s, char *s_con);
Tìm sự xuất hiện đầu tiên của s_con trong s.
nếu có cho địa chỉ chuỗi con, nếu không
NULL
20.strupr: chuyển chữ thường thành chữ
hoa
char *strupr(char *s);
Chuyển mọi chữ thường trong s thành chữ hoa
26
Một số ví dụ
Dùng hàm chuyển chữ
thường thành chữ hoa.
#include
#include
#include
int main(void)
{
char *string = "truong dai hoc cong nghiep tp hcm", *s;
cout << "Xau ban dau la: ";
cout << string; cout << '\n';
cout << "Xau moi la: ";
s = strupr(string);
cout << s;
getch();
return 0;
}
27
Một số hàm kiểm tra ký tự
#include
1. isalnum: kiểm tra ký tự có phải là ký tự alphanumeric
(chữ cái hoặc chữ số) không?
int isalnum(int kt);
2. isalpha: kiểm tra ký tự có phải là chữ cái không?
int isalpha(int kt);
3. iscntrl: kiểm tra ký tự có phải là ký tự điều khiển
không?
int iscntrl(int kt);
4. isdigit: kiểm tra ký tự có phải chữ số không?
int isdigit(int kt);
28
Một số hàm kiểm tra ký tự
5. islower: kiểm tra ký tự có phải là chữ cái thường
không?
int islower(int kt);
6. isupper: kiểm tra ký tự có phải là chữ cái hoa không?
int isupper(int kt);
7. isspace: kiểm tra ký tự có phải là ký tự trống không?
int isspace(int kt);
8. ispunct: kiểm tra ký tự có phải là ký tự dấu chấm câu
không?
int ispunct(int kt);
29
Ví dụ:
isalnum: kiểm tra ký tự
#include
#include
#include
int main(void)
{
char c = 'C';
if (isalnum(c))
cout << "C is alphanumeric";
else cout << "c is not alphanumeric";
getch();
return 0;
}
30
Ví dụ:
isupper: kiểm tra ký tự có phải là chữ …?
#include
#include
#include
int main(void)
{
char c = 'C';
if (isupper(c))
cout<<c<<“ la chu in hoa\n";
else cout<<c<<“ la chu in thuong\n";
getch();
return 0;
}
31
#include
#include
#include
int main(void)
{
char c = 'C';
if (ispunct(c))
cout<<c<<“ la so\n";
else cout<<c<<“ khong la so\n";
getch();
return 0;
}
Mảng các chuỗi
Khai báo:
char arrayList[ ][length] = { constantString_1,
constantString_2,
...
constantString_n};
• arrayList: Tên của mảng chuỗi
• constantString_1, ..., constantString_n : Các
hằng chuỗi
Ví dụ:
char listOfPL[][10] = {“Pascal”, “C/C++”,
“CSharp”, “Java”,“VB”};
Ví dụ:
#include
#include
#include
void main()
{
char name[5][20];
for(int i=0 ; i<5 ; i++)
{
cout << “Input name “ << i+1 <<”: “;
cin >> name[i];
}
cout << “List of names: “;
for(int i=0 ; i<5 ; i++)
cout << name[i] << “, “;
}
Mảng con trỏ đến các chuỗi
Ví dụ:
char *listOfPL[] = {“Pascal”, “C/C++”, “CSharp”, “Java”,
“VB”};
Ví dụ:
#include
#include
#include
#include
void main()
{
char *name[5];
for(int i=0 ; i<5 ; i++)
name[i] = (char *)malloc(20);
for(int i=0 ; i<5 ; i++)
{
cout << "Input name " << i+1 <<": ";
gets(name[i]);
}
cout << "List of names: ";
for(int i=0 ; i<5 ; i++)
cout << name[i] << ", ";
}
Mã ASCII
Thập phân Ký tự
32 Khoảng trắng
27 Escape
48-57 0..9
65-90 A..Z
97-122 a..z