Chuỗi ký ́ tự là trường hợp đặc biệt của mảng 1 chiều, là một dãy các phần tử, mỗi phần tử có kiểu ký tự. Trong bài giảng này chúng ta tìm hiểu một số kiến thức cơ bản của chuỗi kỹ tự như: Khái niệm, khai báo chuỗi kỹ tự, các hàm xử lý chuỗi, một số bài tập. Mời tham khảo.
XỬ LÝ CHUỖI KÝ TỰ Nội dung #2 Khái niệm Khai báo Các hàm xử lý chuỗi Bài tập Khái niệm #3 • Chuỗi ký tự trường hợp đặc biệt mảng chiều, là một dãy các phần tử, phần tử có kiểu ký tự • Hằng ký tự đặt cặp nháy đơn Ví dụ: ‘a’, ‘1’, ‘ ’ • Hằng chuỗi đặt cặp nháy kép Ví dụ: “ho va ten”, “123”, “” Khái niệm #4 • Chuỗi ký tự kết thúc ký tự ‘\0’ (giá trị 0) Do đó khai báo độ dài chuỗi luôn khai báo dư phần tử để chứa ký tự ‘\0’ • Ví dụ: Chuỗi “NGUYEN VAN A” lưu ‘N’ ‘G’ ‘U’ ‘Y’ ‘E’ ‘N’ ‘ ‘ ‘V’ ‘A’ Chuỗi gồm 13 ký tự ‘N’ ‘ ‘ 10 ‘A’ 11 ‘\0’ 12 Khai báo chuỗi #5 • Cách 1: Con trỏ hằng char < Tên chuỗi > [< Số ký tự tối đa>] ; Ví dụ: char str[25]; Ý nghĩa khai báo mảng kiểu ký tự tên là str có 25 phần tử (như có thể lưu tối đa 24 ký tự vì phần tử thứ 25 đã chứa ký tự kết thúc chuỗi ‘\0’ ) Khái niệm #6 • Cách 2: Con trỏ char *< Tên ch̃i >; Ví dụ: char *str; • Phải cấp phát bợ nhớ trước sử dụng chuỗi str • Ví dụ: char *str; str = (char*)malloc(30); //Cấp phát bợ nhớ cho str gồm 30 ký tự Nhập chuỗi #7 • Cú pháp: char *gets(char *str); Nhận các ký tự nhập từ phím cho đến nhấn phím Enter và đưa vào chuỗi str Ví dụ: void main() { char str[80]; printf("Nhap vao chuoi: "); gets(str); printf("Chuoi vua nhap la: %s\n", str); } Nhập chuỗi #8 • Lưu ý: Khơng thể dùng hàm scanf để nhập chuỗi có khoảng trắng • Ví dụ: Giả sử nhập vào chuỗi: “Nguyen Van An” Thì kết xuất hình là: “Nguyen” void main() (do str lưu chuỗi “Nguyen”) { char str[80]; printf("Nhap vao chuoi: "); scanf(“%s”, &str); printf("Chuoi vua nhap la: %s\n", str); } Xuất chuỗi #9 Cú pháp : int puts (const char *s); Ví dụ: void main() { char *str = "Vi du xuat chuoi"; puts(str); } Có thể dùng printf() với định dạng “%s” Các hàm xử lý chuỗi - #10 Tính đợ dài chuỗi: strlen Sao chép chuỗi: strcpy, strncpy Nối chuỗi: strcat, strncat So sánh chuỗi: strcmp, strncmp, stricmp, strnicmp Tìm kiếm: strchr, strstr Tách chuỗi: strtok Đổi thành chữ in HOA: strupr Đổi thành chữ in thường: strlwr So sánh chuỗi #21 !!! Ký tự HOA < Ký tự thường VD: ‘A’ < ‘a’ (do mã Ascii ‘A’ = 65, mã Ascii ‘a’ = 97) Ví dụ: int kq = strcmp("abc", "ABC") Giá trị kq > So sánh chuỗi #22 Ví dụ: char *s1 = “abcd”; char *s2 = "abCD"; if(strcmp(s1, s2)==0) printf("Giong nhau"); else printf(“Khac nhau”); Kết quả: Khac So sánh chuỗi #23 So sánh n ký tự đầu tiên s1 s2, giá trị trả tương tự hàm strcmp() int strncmp(char s1[],char s2[], int n); Ví dụ: char *s1 = “abcd”; char *s2 = "abef"; if(strncmp(s1, s2, 2)==0) printf("Giong nhau"); else printf(“Khac nhau”); Kết quả: Giong So sánh chuỗi #24 So sánh chuỗi s1 s2 không phân biệt hoa thường, giá trị trả tương tự hàm strcmp() int stricmp(char s1[],char s2[]); Ví dụ: char *s1 = “abcd”; char *s2 = "abCD"; if(stricmp(s1, s2)==0) printf("Giong nhau"); else printf(“Khac nhau”); Kết quả: Giong So sánh chuỗi #25 So sánh n ký tự đầu tiên s1 s2, không phân biệt hoa thường, giá trị trả tương tự hàm strcmp() int strnicmp(char s1[],char s2[], int n); Ví dụ: char *s1 = “aBcd”; char *s2 = "Abef"; if(strnicmp(s1, s2, 2)==0) printf("Giong nhau"); else printf(“Khac nhau”); Kết quả: Giong Tìm ký tự chuỗi #26 Tìm xuất đầu tiên ký tư c chuỗi s char *strchr(char s[], char c); Trả về: NULL: nếu không có Địa chỉ c: nếu tìm thấy Tìm ký tự chuỗi #27 Ví dụ: char s[15]; char *ptr, c = 'm'; strcpy(s, "Vi du tim ky tu"); ptr = strchr(s, c); if (ptr) printf("Ky tu %c xuat hien tai: %d", c, ptr-s); else printf("Khong tim thay"); Kết quả: Ky tu m xuat hien tai: Tìm chuỗi #28 Tìm sự xuất đầu tiên chuỗi s2 chuỗi s1 char *strstr(char s1[], char s2[]); Trả về: NULL: nếu không có Ngược lại: Địa chỉ bắt đầu chuỗi s2 s1 Tìm chuỗi #29 Ví dụ: char *s1 = "Borland International"; char *s2 = "nation", *ptr; ptr = strstr(s1, s2); printf("Chuoi con: %s\n", ptr); Kết quả: Chuoi con: national Tách chuỗi #30 Tách chuỗi: char *strtok(char s1[], char s2[]); Nếu s2 có xuất s1: Tách chuỗi s1 thành hai chuỗi: Chuỗi đầu là ký tự cho đến gặp chuỗi s2 đầu tiên, chuỗi sau là ký tự còn lại s1 sau đã bỏ chuỗi s2 xuất s1 Nếu s2 không xuất s1 thì kết chuỗi tách vẫn là s1 Tách chuỗi #31 Ví dụ: char input[16] = "abc,d"; char *p; Kết quả: // Lay chuoi dau S11 = abc p = strtok(input, ","); S12 = d if (p) printf("S11 = %s\n", p); /*Lay chuoi lai, tham so dau la NULL*/ p = strtok(NULL, ","); if (p) printf("S12 = %s", p); Đổi sang chữ in HOA #32 Đổi chuỗi str thành chuỗi in HOA char* strupr(char str[]); Ví dụ: char *s1 = “aBcd”; char *s2 = strupr(s1); printf(“s2 = %s“, s2); Kết quả: ABCD Đổi sang chữ in thường #33 Đổi chuỗi str thành chuỗi in thường char* strlwr(char str[]); Ví dụ: char *s1 = “aBcd”; char *s2 = strlwr(s1); printf(“s2 = %s“, s2); Kết quả: abcd BÀI TẬP #34 • Viết chương trình tìm kiếm ký tự xem có chuỗi hay không, nếu có xuất vị trí từ đó • Viết chương trình tìm kiếm chuỗi xem có chuỗi hay không, nếu có xuất vị trí xuất chuỗi đó • Đếm số từ có chuỗi (từ cách khoảng trắng) • Viết hàm kiểm tra xem chuỗi có t̀n hồn hay khơng? • Viết hàm đảo vị trí từ đầu và từ cuối Ví dụ: nhập “bo an co” xuat “co an bo” 34 Q&A #35 ... đếm số ký tự trắng chuỗi Viết hàm in hình chuỗi theo thứ tự đảo ngược Viết hàm tìm xem ký tự ch có chuỗi khơng? Nếu có cho biết vị trí xuất đầu tiên ch Viết hàm kiểm tra xem chuỗi có... niệm Khai báo Các hàm xử lý chuỗi Bài tập Khái niệm #3 • Chuỗi ký tự trường hợp đặc biệt mảng chiều, là một dãy các phần tử, phần tử có kiểu ký tự • Hằng ký tự đặt cặp nháy đơn Ví... Kết quả: Giong Tìm ký tự chuỗi #26 Tìm xuất đầu tiên ký tư c chuỗi s char *strchr(char s[], char c); Trả về: NULL: nếu khơng có Địa chỉ c: nếu tìm thấy Tìm ký tự chuỗi #27 Ví dụ: char