Giáo trình Lập trình bằng ngôn ngữ C - Chương 5: Xâu kí tự - Ngô Văn Linh

Giữa con trỏ kiểu char và mảng kiểu char có sự khác biệt. Xét ví dụ sau: char ch[20]; char *pc; pc = "Dai Hoc Bach Khoa";/*Hợp lệ*/ ch = "Dai Hoc Bach Khoa";/*Không hợp lệ*/  câu lệnh gán đầu tiên là hợp lệ vì pc là con trỏ kiểu char, còn câu lệnh gán thứ hai không hợp lệ vì ch được khai báo là một mảng ký tự, do đó ch là một hằng, chúng ta không thể gán giá trị cho hằng được.

pdf36 trang | Chia sẻ: huongthu9 | Lượt xem: 391 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình bằng ngôn ngữ C - Chương 5: Xâu kí tự - Ngô Văn Linh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Chương 5 Xâu ký tự Ngo Van Linh Bộ môn Hệ thống thông tin Viện Công nghệ thông tin và Truyền thông Đại học Bách Khoa Hà Nội 2Nội dung  5.1. Khái niệm xâu ký tự  5.2. Khai báo và sử dụng xâu  5.2.1. Khai báo xâu ký tự  5.2.2. Truy cập vào một phần tử của xâu  5.3. Một số hàm làm việc với ký tự và xâu ký tự trong C.  5.3.1. Các hàm xử lý ký tự  5.3.2. Các hàm xử lý xâu ký tự  5.3.3. Một số hàm xử lý xâu ký tự khác  5.3.4. Con trỏ và xâu ký tự 3Nội dung  5.1. Khái niệm xâu ký tự  5.2. Khai báo và sử dụng xâu  5.2.1. Khai báo xâu ký tự  5.2.2. Truy cập vào một phần tử của xâu  5.3. Một số hàm làm việc với ký tự và xâu ký tự trong C.  5.3.1. Các hàm xử lý ký tự  5.3.2. Các hàm xử lý xâu ký tự  5.3.3. Một số hàm xử lý xâu ký tự khác  5.3.4. Con trỏ và xâu ký tự 45.1. Khái niệm xâu ký tự  Là một dãy các kí tự viết liên tiếp nhau.  Xâu rỗng: Xâu không gồm kí tự nào cả.  Độ dài xâu: Số kí tự có trong xâu.  Ví dụ:  "Tin hoc" là một xâu kí tự gồm 7 kí tự: 'T', 'i', 'n', dấu cách (' '), 'h', 'o', và 'c'.  Lưu trữ xâu ký tự:  Ký tự kết thúc xâu: NULL hoặc '\0'. 55.1. Khái niệm xâu ký tự (tiếp)  Cần phân biệt giữa ký tự và xâu bao gồm một ký tự. Ví dụ 'A' là ký tự A được mã hóa bằng 1 byte, trong khi "A" là một xâu ký tự chứa ký tự A xâu này được mã hóa bằng 2 bytes cho ký tự A và ký tự '\0'.  Trong C không tồn tại các phép toán so sánh, gán nội dung của xâu này cho xâu khác. Để thực hiện các công việc này C cung cấp cho người lập trình một thư viện các hàm chuẩn, được khai báo trong tệp header có tên là string.h.  Để sử dụng các hàm thao tác xâu, trên đầu chương trình cần phải có dòng khai báo #include 6Nội dung  5.1. Khái niệm xâu ký tự  5.2. Khai báo và sử dụng xâu  5.2.1. Khai báo xâu ký tự  5.2.2. Truy cập vào một phần tử của xâu  5.3. Một số hàm làm việc với ký tự và xâu ký tự trong C.  5.3.1. Các hàm xử lý ký tự  5.3.2. Các hàm xử lý xâu ký tự  5.3.3. Một số hàm xử lý xâu ký tự khác  5.3.4. Con trỏ và xâu ký tự 75.2.1. Khai báo xâu ký tự  Cú pháp:  char ten_xau[so_ky_tu_toi_da];  Ví dụ:  char ho_va_ten[20]; 85.2.2. Truy cập vào một phần tử của xâu  Cú pháp:  ten_xau[chi_so_ky_tu_can_truy_cap]  Ví dụ:  char que_quan[10] = "Ha noi"; 9Nội dung  5.1. Khái niệm xâu ký tự  5.2. Khai báo và sử dụng xâu  5.2.1. Khai báo xâu ký tự  5.2.2. Truy cập vào một phần tử của xâu  5.3. Một số hàm làm việc với ký tự và xâu ký tự trong C.  5.3.1. Các hàm xử lý ký tự  5.3.2. Các hàm xử lý xâu ký tự  5.3.3. Một số hàm xử lý xâu ký tự khác  5.3.4. Con trỏ và xâu ký tự 10 5.3.1. Các hàm xử lý ký tự  Để sử dụng các hàm này ta khai báo tệp tiêu đề #include  int toupper(int ch)  Chuyển một kí tự chữ cái thường (các kí tự 'a', 'b', , 'z') thành kí tự chữ cái hoa tương ứng ('A', 'B', , 'Z').  int tolower(int ch)  Chuyển một kí tự chữ cái hoa ('A', 'B', , 'Z') thành kí tự chữ cái thường tương ứng ('a', 'b', 'z').  int isalpha(int ch)  Kiểm tra một kí tự có phải là chữ cái hay không ('a', 'b', , 'z', 'A', 'B', , 'Z').  Hàm trả về giá trị khác không nếu đúng là chữ cái, trả về giá trị 0 nếu ngược lại. 11 5.3.1. Các hàm xử lý ký tự (tiếp)  int isdigit(int ch)  Kiểm tra một kí tự có phải là chữ số hay không ('0', '1', '9').  Hàm trả về giá trị khác không nếu đúng, trả về giá trị 0 nếu ngược lại.  int islower(int ch)  Kiểm tra một kí tự có phải là chữ cái thường hay không ('a', 'b', 'z').  Hàm trả về giá trị khác không nếu đúng, trả về giá trị 0 nếu ngược lại.  int isupper(int ch)  Kiểm tra một kí tự có phải là chữ cái hoa hay không ('A', 'B', 'Z').  Hàm trả về giá trị khác không nếu đúng, trả về giá trị 0 nếu ngược lại. 12 5.3.1. Các hàm xử lý ký tự (tiếp)  int iscntrl(int ch)  Kiểm tra một kí tự có phải là kí tự điều khiển hay không (là các kí tự không hiển thị được và có mã ASCII từ 0 đến 31).  Hàm trả về giá trị khác không nếu đúng, trả về giá trị 0 nếu ngược lại.  int isspace(int ch)  Kiểm tra một kí tự có phải là dấu cách (space, mã ASCII là 32), kí tự xuống dòng ('\n', mã ASCII là 10), kí tự về đầu dòng ('\r', mã ASCII là 13), dấu tab ngang ('\t', mã ASCII là 9) hay dấu tab dọc ('\v', mã ASCII là 11) hay không.  Hàm trả về giá trị khác không nếu đúng, trả về giá trị 0 nếu ngược lại. 13 5.3.2. Các hàm xử lý xâu ký tự  Vào ra dữ liệu  Vào ra dữ liệu trên xâu kí tự tức là nhập dữ liệu cho xâu và hiển thị dữ liệu chứa trong xâu.  Khai báo thư viện .  Để nhập dữ liệu cho xâu ta có thể sử dụng 2 hàm scanf() hoặc gets()  scanf("%s", ten_xau);  gets(ten_xau);  Để hiển thị nội dung xâu ta có thể dùng 2 hàm printf() hoặc puts()  printf("%s", ten_xau);  puts(ten_xau); 14 5.3.2. Các hàm xử lý xâu ký tự  Ví dụ: Nhập vào một chuỗi và hiển thị trên màn hình chuỗi vừa nhập. #include #include #include int main() { char ten[12]; printf("Nhap chuoi: "); gets(ten); printf("Chuoi vua nhap: "); puts(ten); getch(); return 0; } 15 5.3.3. Một số hàm xử lý xâu ký tự khác  Khai báo tệp tiêu đề #include  int strlen(char* tên_xâu);  Trả về độ dài (số kí tự có trong xâu) của xâu kí tự tên_xâu.  char* strcpy(char* xâu_đích, char* xâu_nguồn)  Sao chép nội dung xâu_nguồn và ghi lên xâu_đích.  char* strncpy(char* xâu_đích, char* xâu_nguồn, int n)  Tương tự strcpy() nhưng ngừng sao chép sau n ký tự. Trong trường hợp không có đủ số ký tự trong xâu nguồn thì hàm sẽ điền thêm các ký tự trắng vào xâu đích. 16 5.3.3. Một số hàm xử lý xâu ký tự khác  int strcmp(char* xâu_thứ_nhất, char* xâu_thứ_hai);  Trả về  giá trị < 0 nếu xâu_thứ_nhất nhỏ hơn xâu_thứ_hai  giá trị 0 nếu xâu_thứ_nhất bằng xâu_thứ_hai  giá trị > 0 nếu xâu_-thứ _nhất lớn hơn xâu_thứ_hai  int strncmp(char* xâu_thứ_nhất, char* xâu_thứ_hai, int n);  Tương tự như hàm strcmp nhưng giới hạn việc so sánh với n ký tự đầu tiên của hai xâu.  int stricmp(char* xâu_thứ_nhất, char* xâu_thứ_hai);  Tương tự như strcmp() nhưng không phân biệt chữ hoa hay chữ thường.  int strnicmp(char* xâu_thứ_nhất, char* xâu_thứ_hai, int n);  Tương tự như hàm stricmp nhưng giới hạn việc so sánh với n ký tự đầu tiên của hai xâu. 17 5.3.3. Một số hàm xử lý xâu ký tự khác  char* strchr(char* str, int ch);  Tìm kiếm vị trí của kí tự ch trong xâu str.  Nếu có kí tự ch trong str thì hàm strchr() trả về con trỏ trỏ tới kí tự ch đầu tiên trong str, ngược lại nó sẽ trả về con trỏ NULL.  char* strrchr(char* str, int ch);  Tương tự như strchr() nhưng việc tìm kiếm bắt đầu từ cuối xâu str.  char* strstr(char* str1, char* str2);  Tìm kiếm vị trí của xâu con str2 trong xâu str1.  Nếu str2 là xâu con của str1 thì hàm strstr() trả về con trỏ trỏ tới kí tự đầu tiên của xâu con str2 đầu tiên trong str1, ngược lại nó sẽ trả về con trỏ NULL. 18 5.3.3. Một số hàm xử lý xâu ký tự khác  char* strcat(char* xâu_đích, char* xâu_nguồn);  Ghép nối xâu_nguồn vào ngay sau xâu_đích.  Kết quả trả về của hàm strcat() là xâu mới ghép nối từ 2 xâu xâu_nguồn và xâu_đích.  char* strncat(char* xâu_đích, char* xâu_nguồn, int n);  Tương tự strcat nhưng chỉ giới hạn với n ký tự đầu tiên của xâu_nguồn.  char* strlwr(char* xâu)  Chuyển đổi các chữ in hoa trong xâu sang chữ thường.  char* strupr(char* xâu)  Chuyển đổi các chữ thường trong xâu sang chữ in hoa. 19 5.3.3. Một số hàm xử lý xâu ký tự khác  void strset(char* s, char c)  Khởi đầu giá trị tất cả các ký tự của xâu s bằng ký tự c  void strnset(char* s, char c, int n)  Khởi đầu giá trị cho n ký tự đầu tiên của xâu s bằng ký tự c  int atoi(char* str)  Chuyển một xâu kí tự là biểu diễn của một số nguyên thành số nguyên tương ứng.  Nếu chuyển đổi thành công, hàm atoi() trả về giá trị số nguyên chuyển đổi được, ngược lại trả về giá trị 0. 20 5.3.4. Con trỏ và xâu ký tự  Như đã biết xâu ký tự là một dãy các ký tự đặt trong hai dấu nháy kép, ví dụ: "Dai Hoc Bach Khoa".  Cũng giống như mảng, xâu ký tự là một hằng địa chỉ biểu thị địa chỉ đầu của mảng ký tự chứa xâu (Mảng này chứa các ký tự của xâu công thêm ký tự NULL).  Vì vậy, nếu chúng ta khai báo char *pc; là một con trỏ kiểu char thì phép gán pc="Dai Hoc Bach Khoa" là hợp lệ. Sau khi thực hiện câu lệnh này, trong con trỏ pc có địa chỉ đầu của xâu "Dai Hoc Bach Khoa". 21 5.3.4. Con trỏ và xâu ký tự  Giữa con trỏ kiểu char và mảng kiểu char có sự khác biệt. Xét ví dụ sau: char ch[20]; char *pc; pc = "Dai Hoc Bach Khoa";/*Hợp lệ*/ ch = "Dai Hoc Bach Khoa";/*Không hợp lệ*/  câu lệnh gán đầu tiên là hợp lệ vì pc là con trỏ kiểu char, còn câu lệnh gán thứ hai không hợp lệ vì ch được khai báo là một mảng ký tự, do đó ch là một hằng, chúng ta không thể gán giá trị cho hằng được. 22 5.3.4. Con trỏ và xâu ký tự  Có thể thao tác trên tất cả các ký tự của xâu thông qua một con trỏ. #include void main() { int i; char *str; str = "Lap trinh C that thu vi"; for (i = 0; *str != '\0'; i++) str++; printf("so cac ky tu = %d\n",i); } 23 Bài tập  Bài 1: Nhập một xâu kí tự từ bàn phím gồm các từ, ví dụ "Thu do Ha Noi". Lập chương trình để bỏ bớt các dấu trống giữa các từ sao cho các từ chỉ cách nhau ít nhất một dấu trống.  Bài 2: Viết chương trình nhập vào từ bàn phím họ và tên của một người, sau đó in phần tên ra màn hình. Ví dụ: "Tran Hung Dao" thì in ra "Dao".  Bài 3: Nhập vào một câu, kết thúc bằng dấu chấm. In ra câu đó có bao nhiêu từ. 24 Bài chữa bài 2 #include #include #include void main(){ char s[30], *p; clrscr(); printf("Nhap vao mot xau ho va ten"); gets(s); /* Dùng hàm strrchr duyệt ngược từ cuối xâu, tìm vị trí đầu tiên của một ký tự và trả về con trỏ trỏ đến ký tự đó. */ p = strrchr(s,' '); // Tìm ký tự trống đầu tiên từ cuối xâu s p = p + 1; printf("\nPhan ten la: %s\n",p); getch(); } 25 Bài 1 26 #include #include #include int main(int argc, char *argv[]) { char s[50], t[5]=" ", *p, *q; int i,j; printf("Nhap xau: "); fflush(stdin);gets(s); for(i=0;i<strlen(s);i++){ q = s; p = strstr(s,t); 27 i = p - q; if(i<strlen(s)){ j = i++; do{ s[j] = s[j+1]; j++; }while(j<strlen(s)); } } printf("\nXau la:%s",s); getch(); return 0; } Bài 2 (another way to solve) 28 #include #include #include int main(int argc, char *argv[]) { char s[50], *p, *q; int i; printf("Nhap xau: "); fflush(stdin);gets(s); p=s; 29 for(i=1;*p!='\0';i++){ p++; if(*p==' ')q=p; } q++; printf("\nXau la:%s",q); getch(); return 0; } Bài 3 30 #include #include #include int main(int argc, char *argv[]) { char s[50]; int i, n=1; printf("Nhap xau: "); fflush(stdin);gets(s); if(s[strlen(s)-1] !='.') printf("Nhap sai roi!"); else{ for(i=0;i<strlen(s)-1;i++) if(s[i]!=' ' && s[i+1]==' ') n++; printf("\nSo tu la: %d\n", n); } getch() ; return 0; } Bài 3: 31 #include #include #include void main(){ char s[100]; int i=0,n=0; printf("Nhap cau:");gets(s); while(i<strlen(s)){ while(s[i]==' ') i++; if(i==strlen(s)) break; while(s[i]!=' ') i++; n++; } printf("\nSo tu la: %d", n); getch(); } 32 33 34 35 36

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_bang_ngon_ngu_c_chuong_5_xau_ki_tu_ngo.pdf