Bài giảng Nhập môn lập trình - Chủ đề 5: Kiểu dữ liệu mảng, chuỗi - Phần 3: Chuỗi kí tự

pdf 20 trang phuongnguyen 9870
Bạn đang xem tài liệu "Bài giảng Nhập môn lập trình - Chủ đề 5: Kiểu dữ liệu mảng, chuỗi - Phần 3: Chuỗi kí tự", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_nhap_mon_lap_trinh_chu_de_5_kieu_du_lieu_mang_chuo.pdf

Nội dung text: Bài giảng Nhập môn lập trình - Chủ đề 5: Kiểu dữ liệu mảng, chuỗi - Phần 3: Chuỗi kí tự

  1. NHẬP MÔN LẬP TRÌNH CHUỖI KÝ TỰ 1
  2. Nội dung 1 Khái niệm 2 Khởitạo 3 Các thao tác trên chuỗikýtự 4 Bài tập Chuỗikýtự 2
  3. Khái niệm ™Khái niệm ƒ Kiểu char chỉ chứa được mộtkýtự. Để lưu trữ mộtchuỗi (nhiềukýtự) ta sử dụng mảng (mộtchiều) cáckýtự. ƒ Chuỗikýtự kếtthúcbằng ký tự ‘\0’ (null) Î Độ dài chuỗi = kích thước mảng–1 ™Ví dụ char hoten[30]; // Dài 29 ký tự char ngaysinh[9]; // Dài 8 ký tự Chuỗikýtự 3
  4. Khởitạo ™Khởitạonhư mảng thông thường ƒ Độ dài cụ thể char s[10] = {‘T’, ‘H’, ‘C’, ‘S’, ‘ ’, ‘A’, ‘\0’}; char s[10] = “THCS A”; // Tựđộng thêm ‘\0’ 0123456789 ‘T’ ‘H’ ‘C’ ‘S’ ‘’‘A’‘\0’ ƒ Tự xác định độ dài char s[] = {‘T’, ‘H’, ‘C’, ‘S’, ‘ ’, ‘A’, ‘\0’}; char s[] = “THCS A”; // Tựđộng thêm ‘\0’ 0123456 ‘T’ ‘H’ ‘C’ ‘S’ ‘’‘A’‘\0’ Chuỗikýtự 4
  5. Xuấtchuỗi ™Sử dụng hàm printf với đặc tả “%s” char monhoc[50] = “Tin hoc co so A”; printf(“%s”, monhoc); // Không xuống dòng Tin hoc co so A_ ™Sử dụng hàm puts char monhoc[50] = “Tin hoc co so A”; puts(monhoc); // Tựđộng xuống dòng Ù printf(“%s\n”, monhoc); Tin hoc co so A _ Chuỗikýtự 5
  6. Nhậpchuỗi ™Sử dụng hàm scanf với đặc tả “%s” ƒ Chỉ nhậncáckýtự từ bàn phím đến khi gặp ký tự khoảng trắng hoặckýtự xuống dòng. ƒ Chuỗinhận được không bao gồmkýtự khoảng trắng và xuống dòng. char monhoc[50]; printf(“Nhap mot chuoi: ”); scanf(“%s”, monhoc); printf(“Chuoi nhan duoc la: %s”, monhoc); Nhap mot chuoi: Tin hoc co so A Chuoi nhan duoc la: Tin_ Chuỗikýtự 6
  7. Nhậpchuỗi ™Sử dụng hàm gets ƒ Nhậncáckýtự từ bàn phím đến khi gặpkýtự xuống dòng. ƒ Chuỗinhận được là những gì người dùng nhập(trừ ký tự xuống dòng). char monhoc[50]; printf(“Nhap mot chuoi: ”); gets(monhoc); printf(“Chuoi nhan duoc la: %s”, monhoc); Nhap mot chuoi: Tin hoc co so A Chuoi nhan duoc la: Tin hoc co so A _ Chuỗikýtự 7
  8. Mộtsố hàm thao tác trên chuỗi ™Thuộcthư viện ƒ strlen ƒ strcpy ƒ strdup ƒ strlwr/strupr ƒ strrev ƒ strcmp/stricmp ƒ strcat ƒ strstr Chuỗikýtự 8
  9. Hàm tính độ dài chuỗi size_t strlenstrlen(const(const char *s)*s) Tính độ dài chuỗi s. size_t thay cho unsigned (trong ) dùng để đo các đại lượng không dấu. Độ dài chuỗi s (không tính ký tự kết thúc) char s[] = “Visual C++ 6.0”; int len = strlen(s); // => 14 Chuỗikýtự 9
  10. Hàm sao chép chuỗi char *strcpy(char*strcpy(char *dest,*dest, const char *ssrcrc)) Sao chép chuỗi src sang chuỗi dest, dừng khi ký tự kết thúc chuỗi ‘\0’ vừa được chép. ! dest phải đủ lớn để chứasrc Con trỏ dest. char s[100]; s = “Visual C++ 6.0”; // sai strcpy(s, “Visual C++ 6.0”); // đúng Chuỗikýtự 10
  11. Hàm tạobảnsao char *strdup(const*strdup(const ccharhar *s)*s) Tạobảnsaocủamộtchuỗi s cho trước. Hàm sẽ tự tạovùngnhớ dài strlen(s) + 1 (bytes) để chứachuỗi s. Phảitự hủy vùng nhớ này khi không sử dụng nữa. Thành công: trả về con trỏđếnvùngnhớ chứachuỗibảnsao. Thấtbại: trả về NULL. char *s; s = strdup(“Visual C++ 6.0”); Chuỗikýtự 11
  12. Hàm chuyểnthànhchuỗithường char *strlwr(char*strlwr(char *s)*s) Chuyểnchuỗi s thành chuỗithường (‘A’ thành ‘a’, ‘B’ thành ‘b’, , ‘Z’ thành ‘z’) Con trỏđếnchuỗi s. char s[] = “Visual C++ 6.0”; strlwr(s); puts(s); // visual c++ 6.0 Chuỗikýtự 12
  13. Hàm chuyểnthànhchuỗiIN char *stru*struprpr(c(chharar *s)*s) Chuyểnchuỗi s thành chuỗiIN (‘a’thành ‘A’, ‘b’ thành ‘B’, , ‘z’ thành ‘Z’) Con trỏđếnchuỗi s. char s[] = “Visual C++ 6.0”; strupr(s); puts(s); // VISUAL C++ 6.0 Chuỗikýtự 13
  14. Hàm đảo ngược chuỗi char *strrev(char*strrev(char *s)*s) Đảongược thứ tự các ký tự trong chuỗi s (trừ ký tự kết thúc chuỗi). Con trỏđếnchuỗikếtquả. char s[] = “Visual C++ 6.0”; strrev(s); puts(s); // 0.6 ++C lausiV Chuỗikýtự 14
  15. Hàm so sánh hai chuỗi int sstrcmptrcmp(const(const ccharhar *s1,*s1, const char *s2s2) So sánh hai chuỗi s1 và s2 (phân biệthoa thường). 0 nếus1 > s2 char s1[] = “visual C++ 6.0”; char s2[] = “Visual C++ 6.0”; int kq = strcmp(s1, s2); // => kq > 0 Chuỗikýtự 15
  16. Hàm so sánh hai chuỗi int sstricmptricmp(const(const char *s1,*s1, const char *s2s2) So sánh hai chuỗi s1 và s2 (không phân biệt hoa thường). 0 nếus1 > s2 char s1[] = “visual c++ 6.0”; char s2[] = “VISUAL C++ 6.0”; int kq = stricmp(s1, s2);// => kq == 0 Chuỗikýtự 16
  17. Hàm nốihaichuỗi char* strcatstrcat(char(char *dest,dest, const char *src)*src) Nốichuỗi src vào sau chuỗi dest. ! Chuỗidestphải đủ chứakếtquả Con trỏđếnchuỗi được nối. char s1[100] = “Visual C++”; char s2[] = “6.0”; strcat(s1, “ ”); // => “Visual C++ ” strcat(s1, s2); // => “Visual C++ 6.0” Chuỗikýtự 17
  18. Hàm tìm chuỗi trong chuỗi char* strstr(constrstr(constst char *s1,*s1, const char *s2)*s2) Tìm vị trí xuấthiện đầu tiên của s2 trong s1 Thành công: trả về con trỏđến vị trí xuất hiện đầu tiên của s2 trong s1. Thấtbại: trả về null. char s1[] = “Visual C++ 6.0”; char s2[] = “C++”; if (strstr(s1, s2) != null) printf(“Tim thay s2 trong s1 ”); Chuỗikýtự 18
  19. Bài tập ™Bài 1: Xem thêm mộtsố hàm khác như: ƒ atoi, atol, atof : đổi chuỗi thành số. ƒ itoa, ltoa, ultoa: đổi số thành chuỗi. ƒ strtok ™Bài 2: Viết hàm nhậnvàomộtchuỗivàtrả về chuỗitương ứng (giữ nguyên chuỗi đầuvào): ƒ Các ký tự thành ký tự thường (giống strlwr). ƒ Các ký tự thành ký tự hoa (giống strupr). ƒ Các ký tựđầu tiên mỗitừ thành ký tự hoa. ƒ Chuẩn hóa chuỗi(xóakhoảng trắng thừa). Chuỗikýtự 19
  20. Bài tập ™Bài 3: Viết hàm nhậnvàomộtchuỗis vàtrả về chuỗitương ứng sau khi xóa các khoảng trắng. ™Bài 4: Viết hàm nhậnvàomộtchuỗis vàđếm xem có bao nhiêu từ trong chuỗi đó. ™Bài 5: Viết hàm nhậnvàomộtchuỗis vàxuất các từ trên các dòng liên tiếp. ™Bài 6: Viếthàmtìmtừ có chiều dài lớnnhấtvà xuất ra màn hình từđóvàđộ dài tương ứng. ™Bài 7: Viết hàm trích ra n ký tựđầu tiên/cuối cùng/bắt đầu tạivị trí pos củachuỗis chotrước. Chuỗikýtự 20