Chương 8: Chuỗi ký tự

• 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”

pdf37 trang | Chia sẻ: lylyngoc | Lượt xem: 1479 | Lượt tải: 0download
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
Tài liệu liên quan