Lập trình C Aptech - Bài 17: Chuỗi
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Giải thích các biến và hằng kiểu chuỗi
Giải thích con trỏ trỏ đến chuỗi
Thực hiện các thao tác nhập/xuất chuỗi
Giải thích các hàm thao tác chuỗi
Giải thích cách thức truyền mảng vào hàm như tham số
Mô tả cách thức sử dụng chuỗi như các tham số của hàm.
ia"; char name4[15] = "Geena"; int i; clrscr(); i = strcmp(name1,name2); printf("%s compared with %s returned %d\n", name1, name2, i); i=strcmp(name1, name3); printf("%s compared with %s returned %d\n", name1, name3, i); i=strcmp(name1,name4); printf("%s compared with %s returned %d\n", name1, name4, i); getch(); } Kết quả của chương trình trên được minh họa như sau: Mẫu xuất ra màn hình của chương trình trên sẽ là: Geena compared with Dorothy returned 3 Geena compared with Shania returned -12 Geena compared with Geena returned 0 Lưu ý giá trị trả về trong mỗi phép so sánh ở ví dụ trên. Đó là sự khác nhau về mã ASCII của hai kí tự khác nhau đầu tiên tìm thấy trong hai chuỗi. Lưu ý giá trị trả về cho mỗi phép so sánh. Nó là sự khác biệt giữa các giá trị ASCII của hai ký tự khác nhau đầu tiên tìm gặp trong hai chuỗi. 17.2.3 Hàm strchr() Hàm strchr() xác định vị trí xuất hiện của một ký tự trong một chuỗi. Cú pháp hàm là: strchr(str, chr); trong đó str là một mảng ký tự hay chuỗi. chr là một biến ký tự chứa giá trị cần tìm. Hàm trả về con trỏ trỏ đến giá trị tìm được đầu tiên trong chuỗi, hoặc NULL nếu không tìm gặpthấy. Chương trình sau đây xác định liệu ký tự ‘a’ có xuất hiện trong hai tên thành phố được nêu ratên hai thành phố hay không. Ví dụ 5: #include #include void main() { char str1[15] = "New York"; char str2[15] = "Washington"; char chr = 'a', *loc; clrscr(); loc = strchr(str1, chr); /* Checks for the occurrence of the character value held by chr in the first city name */ if(loc != NULL) printf("%c occurs in %s\n", chr, str1); else printf("%c does not occur in %s\n", chr, str1); loc = strchr(str2, chr); /* Checks for the occurrence of the character in the second city name */ if(loc != NULL) printf("%c occurs in %s\n", chr, str2); else printf("%c does not occur in %s\n", chr, str2); getch(); } Kết quả của chương trình trên được minh họa như sau: Kết quả xuất ra màn hình của chương trình trên là: a does not occur in New York a occurs in Washington 17.2.4 Hàm strcpy() Trong C không có toán tử nào xử lý một chuỗi như là một đơn vị duy nhất. Vì vậy, phép gán một giá trị chuỗi này cho một chuỗi khác đòi hỏi phải sử dụng hàm strcpy(). Cú pháp hàm là: strcpy(str1, str2); trong đó str1 và str2 là hai mảng ký tự đã được khai báo và khởi tạo. Hàm sao chép giá trị str2 vào str1 và trả về chuỗi str1. Chương trình sau đây minh họa việc sử dụng hàm strcpy(). Nó thay đổi tên của một khách sạn và hiển thị tên mới. Ví dụ 6: #include #include void main() { char hotelname1[15] = "Sea View"; char hotelname2[15] = "Sea Breeze"; clrscr(); printf("The old name is %s\n", hotelname1); strcpy(hotelname1, hotelname2); /*Changes the hotel name*/ printf("The new name is %s\n", hotelname1); /*Displays the new name*/ getch(); } Kết quả của chương trình trên được minh họa như sau: Kết quả xuất ra màn hình của chương trình trên là: The old name is Sea View The new name is Sea Breeze 17.2.5 Hàm strlen() Hàm strlen() trả về chiều dài của chuỗi. Chiều dài của chuỗi rất hay được sử dụng trong các vòng lặp truy câp từng kí tự của chuỗi. Cú pháp của hàm là: Hàm strlen() trả về độ dài chuỗi. Độ dài chuỗi có thể hữu dụng trong các chương trình truy cập đến từng ký tự của chuỗi trong một vòng lặp. Cú pháp hàm là: strlen(str); trong đó str là mảng ký tự đã được khai báo và khởi tạo. Hàm trả về độ dài chuỗichiều dài của chuỗi str. Chương trình sau đây đưa ra ví dụ đơn giản sử dụng hàm strlen(). Nó tìm chiều dài của tên một công ty và hiển thị tên công ty đó với các ký tự được phân cách nhau bởi ký tự ‘*’.hiển thị tên đó ra màn hình cùng với một số các kí tự khác. Chương trình sau đây cho thấy thao tác đơn giản của hàm strlen(). Nó xác định độ dài chuỗi của một tên công ty và hiển thị tên cùng với một số ký tự thêm vào. Ví dụ 7: #include #include void main() { char compname[20] = "Microsoft"; int len, ctr; clrscr(); len = strlen(compname); /* Determines the length of the string */ for(ctr = 0; ctr < len; ctr++) /* Accesses and displays each character of the string*/ printf("%c * ", compname[ctr]); getch(); } Kết quả của chương trình trên được minh họa như sau: Kết quả xuất ra màn hình của chương trình trên là: M * i * c * r * o * s * o * f * t * 17.3 Truyền mảng vào hàm Trong C, khi một mảng được truyền vào hàm như một đốitham số, thì chỉ có địa chỉ của mảng được truyền vào. Tên mảng không kèm theo chỉ số là địa chỉ của mảng. Đoạn mã dưới đây mô tả cách truyền địa chỉ của mảng ary cho hàm fn_ary(): Đoạn trích mã lệnh sau đây truyền địa chỉ của mảng ary vào hàm fn_ary(): void main() { int ary[10]; . . fn_ary(ary); . . } Nếu đốitham số của hàm là một mảng một chiều, thì tham số hình thức đó có thể được khai báo theo một trong các cách sau: Nếu một hàm nhận một mảng một chiều, các tham số hình thức có thể được khai báo theo một trong các cách sau đây: fn_ary (int ary [10]) /* sized array */ { : } hoặc fn_arry (int ary []) /*unsized array */ { : } Cả hai khai báo ở trên đều cho cùng kết quả. Kiểu thứ nhất sử dụng cách khai báo mảng chuẩn, chỉ rõ ra kích thước của mảng. Kiểu thứ hai, chỉ ra rằng tham số là một mảng kiểu int có kích thước bất kì. Cả hai khai báo ở trên đều cho cùng kết quả. Kiểu đầu tiên sử dụng cách khai báo mảng chuẩn. Ở kiểu thứ hai, khai báo mảng đơn giản chỉ mô tả rằng cần đưa vào một mảng kiểu int với một độ dài nào đó. Chương trình sau đây nhận các số vào một mảng số nguyên. Sau đó mảng này sẽ được truyền vào hàm sum_arr(). Hàm sẽ tính toán và trả về tổng của các số nguyên trong mảng. Ví dụ 8: #include void main() { int num[5], ctr, sum = 0; int sum_arr(int num_arr[]); /* Function declaration */ clrscr(); for(ctr = 0; ctr < 5; ctr++) /*Accepts numbers into the array*/ { printf("\nEnter number %d: ", ctr+1); scanf("%d", &num[ctr]); } sum = sum_arr(num); /* Invokes the function */ printf("\nThe sum of the array is %d", sum); getch(); } int sum_arr(int num_arr[]) /* Function definition */ { int i, total; for(i = 0, total = 0; i < 5; i++) /* Calculates the sum */ total += num_arr[i]; return total; /* Returns the sum to main() */ } Kết quả của chương trình trên được minh họa như sau: Một mẫu kết xuất ra màn hình của chương trình trên là: Enter number 1: 5 Enter number 2: 10 Enter number 3: 13 Enter number 4: 26 Enter number 5: 21 The sum of the array is 75 17.4 Truyền chuỗi vào hàm Chuỗi, hay mảng ký tự, có thể được truyền vào hàm. Ví dụ, chương trình sau đây sẽ nhận vào các chuỗi và đưa vào lưu trong một mảng ký tự hai chiều. Sau đó, mảng này sẽ được truyền vào trong một hàm dùng để xác địnhtìm chuỗi dài nhất trong mảng đó. Ví dụ 9: #include void main() { char lines[5][20]; int ctr, longctr = 0; int longest(char lines_arr[][20]); /* Function declaration */ clrscr(); for(ctr = 0; ctr < 5; ctr++) /* Accepts string values into the array */ { printf("\nEnter string %d: ", ctr + 1); scanf("%s", lines[ctr]); } longctr = longest(lines); /* Passes the array to the function */ printf("\nThe longest string is %s", lines[longctr]); getch(); } int longest(char lines_arr[][20]) /* Function definition */ { int i = 0, l_ctr = 0, prev_len, new_len; prev_len = strlen(lines_arr[i]); /* Determines the length of the first element */ for(i++; i < 5; i++) { new_len = strlen(lines_arr[i]); /* Determines the length of the next element */ if(new_len > prev_len) l_ctr = i; /* Stores the subscript of the longer string */ prev_len = new_len; } return l_ctr; /* Returns the subscript of the longest string */ } Kết quả của chương trình trên được minh họa như sau: Một mẫu kết xuất ra màn hình của chương trình trên là: Enter string 1: The Enter string 2: Sigma Enter string 3: Protocol Enter string 4: Robert Enter string 5: Ludlum The longest string is Protocol Tóm tắt bài học Chuỗi trong C được cài đặt như mảng các ký tự kết thúc bằng ký tự NULL (‘\0’). Các biến chuỗi được sử dụng để lưu trữ một dãy các ký tự. Một hằng chuỗi là một dãy các ký tự bao bởi dấu nháy kép. Các chuỗi có thể được lưu trữ và truy cập bằng cách sử dụng các con trỏ ký tự. Các thao thác nhập/xuất chuỗi trong C được thực hiện bằng các hàm thuộc thư viện nhập/xuất chuẩn stdio.h. Hàm gets() và puts() là cách đơn giản nhất để nhập vào và hiển thị chuỗi. Hàm scanf() và printf() có thể được sử dụng để nhập vào và hiển thị chuỗi đi cùng với các kiểu dữ liệu khác. C hỗ trợ rất nhiều hàm về chuỗi, mà chúng ta có thể tìm thấy trong tập tinthư viện chuẩn header string.h. Hàm strcat() được sử dụng để nối hai giá trị chuỗi vào một. Hàm strcmp() so sánh hai chuỗi và trả về một số nguyên dựa vào kết quả của phép so sánh. Hàm strchr() xác định vị trí xuất hiện của một ký tự trong một chuỗi. Hàm strcpy() sao chép nội dung của một chuỗi vào một chuỗi khác. Hàm strlen() trả về độ dài của chuỗi. Trong C, khi một mảng được truyền vào hàm như một đốitham số, chỉ có địa chỉ của mảng được truyền vào. Tên mảng không đi kèm với chỉ số là địa chỉ của mảng. Kiểm tra tiến độ học tập Các chuỗi được kết thúc bởi ký tự __________. Số lượng ký tự có thể nhập vào char_arr[15] là _________. Sự thay đổi giá trị của con trỏ kiểu chuỗi có thể dẫn đến mất dữ liệu. (Đúng / Sai) Ký tự __ được sử dụng để sang dòng mới trong printf(). Để sử dụng hàm strcat(), tập tin header ________ phải được bao gồm trong chương trình. Hai con trỏ có thể so sánh được chỉ khi cả hai biến đang trỏ đến các biến có kiểu khác nhau. (Đúng / Sai) strcmp() trả về _______ nếu hai chuỗi hoàn toàn giống nhau. Khi một mảng được truyền vào một hàm, chỉ có _______ của nó được truyền. Bài tập tự làm Viết một chương trình để nhập vào hai chuỗi. Chương trình sẽ xác định liệu chuỗi thứ nhất có xuất hiện ở cuối chuỗi thứ hai không. Viết một chương trình nhập vào một mảng các số và hiển thị giá trị trung bình. Sử dụng hàm để tính giá trị trung bình.
File đính kèm:
- Lập trình C Aptech - Bài 17 Chuỗi.doc