Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 6: Xâu ký tự - Nguyễn Thanh Hùng

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’.

Cú pháp:

char ten_xau [so_ky_tu_toi_da];

Ví dụ:

char ho_va_ten[20];

Ví dụ:

Khai báo xâu ký tự s có độ dài tối đa là 30:

 char s[30];

Khởi tạo giá trị cho xâu ký tự khi khai báo:

char s[15] = {‘T', ‘r', ‘u', ‘o', ‘n ', ‘g', ‘ ’, ‘D', ‘H’, ‘B', ‘K’, ‘\0' };

char s[15] = “Truong DHBK”; /*trinh dich tu them \0 vao cuoi xau */

char s[] = “Truong DHBK”;/* trinh dich tu tinh chieu dai xau = 12 */

 

ppt 37 trang kimcuc 4740
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 6: Xâu ký tự - Nguyễn Thanh Hùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 6: Xâu ký tự - Nguyễn Thanh Hùng

Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 6: Xâu ký tự - Nguyễn Thanh Hùng
1 
TIN HỌC ĐẠI CƯƠNG  PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C BÀI 6: XÂU KÝ TỰ 
KHOA C¤NG NGHÖ TH¤NG TIN 
FACULTY OF INFORMATION TECHNOLOGY 
2 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
BÀI 6:	XÂU KÝ TỰ 
6.1. Khái niệm xâu ký tự 
6.2. Khai báo và sử dụng xâu 
6.3. Một số hàm làm việc với ký tự và xâu ký tự trong C. 
6.3.1. Các hàm xử lý ký tự 
6.3.2. Các hàm xử lý xâu ký tự 
6.3.3. Một số hàm xử lý xâu ký tự khác 
6.3.4. Con trỏ và xâu ký tự 
3 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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’. 
4 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
BÀI 6:	XÂU KÝ TỰ 
6.1. Khái niệm xâu ký tự 
6.2. Khai báo và sử dụng xâu 
6.3. Một số hàm làm việc với ký tự và xâu ký tự trong C. 
6.3.1. Các hàm xử lý ký tự 
6.3.2. Các hàm xử lý xâu ký tự 
6.3.3. Một số hàm xử lý xâu ký tự khác 
6.3.4. Con trỏ và xâu ký tự 
5 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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]; 
6 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.1. Khai báo xâu ký tự (2) 
Ví dụ: 
Khai báo xâu ký tự s có độ dài tối đa là 30: 
	 char s[30]; 
Khởi tạo giá trị cho xâu ký tự khi khai báo: 
char s[15] = {‘T', ‘r', ‘u', ‘o', ‘n', ‘g', ‘ ’, ‘D', ‘H’, ‘B', ‘K’, ‘\0' }; 
char s[15] = “Truong DHBK”; /*trinh dich tu them \0 vao cuoi xau */ 
char s[] = “Truong DHBK”;/* trinh dich tu tinh chieu dai xau = 12 */ 
7 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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 ” ; 
8 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.3. Nhập/xuất xâu ký tự 
Nhập xâu: 
Sử dụng scanf 
Cú pháp: scanf(“%s”,biến_xâu_kt); 
char str[10]; 
scanf(“%s”,str); //không cần &str. 
Nếu người dùng nhập một xâu có dấu cách thì chỉ phần ký tự nằm trước dấu cách đầu tiên được nhập cho xâu ký tự (vd: trong ví dụ trên, nếu nhập xâu “Viet Nam” rồi gõ Enter thì s = “Viet”. Phần còn lại được đẩy vào bộ đệm). 
Sử dụng gets 
Cú pháp: gets(s); 
Nhập được cả xâu ký tự có dấu cách. 
Xuất xâu ra màn hình: printf(“%s”,str) hoặc puts(str) 
9 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.3. Nhập/xuất xâu ký tự - gets() & printf() 
/* Minh hoa cach su dung gets() & printf() */ 
#include 
#include 
void main() 
{ 
 char ten[80]; 
 printf("\nXin cho biet ten cua ban : "); 
 gets(ten); 
 printf("Chao %s\n", ten); 
 getch(); 
} 
10 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.3. Nhập/xuất xâu ký tự - scanf() & puts() 
/* Minh hoa cach su dung scanf() & puts() */ 
#include 
char ho[81], ten[81]; 
int count, soTheSV; 
void main() { 
puts(“Hay nhap ho, ten va so the SV cach nhau boi"); 
puts(" dau cach roi go Enter "); 
count = scanf("%s%s%d", ho, ten, &soTheSV); 
printf("%d muc vua nhap: %s %s %d \n", count, ho, 	ten, soTheSV); 
getch(); 
} 
11 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
BÀI 6:	XÂU KÝ TỰ 
6.1. Khái niệm xâu ký tự 
6.2. Khai báo và sử dụng xâu 
6.3. Một số hàm làm việc với ký tự và xâu ký tự trong C. 
6.3.1. Các hàm xử lý ký tự 
6.3.2. Các hàm xử lý xâu ký tự 
6.3.3. Một số hàm xử lý xâu ký tự khác 
6.3.4. Con trỏ và xâu ký tự 
12 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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 đề ctype.h. 
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. 
13 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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. 
14 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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. 
15 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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); 
16 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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; 
} 
17 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.3.3. Một số hàm xử lý xâu ký tự khác 
size_t 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. 
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 
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. 
18 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.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* 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. 
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. 
19 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.4. Thư viện 
Thư viện chứa các hàm xử lý xâu ký tự: 
strlen(s): hàm trả về độ dài của xâu s. 
strcpy(s1,s2): sao chép xâu s2 sang xâu s1. 
VD: strcpy(s, “Hello”); //s se nhan xau “Hello” 
Lưu ý: Không được gán s=“Hello” mà phải dùng strcpy. 
strcat(s1,s2): nối xâu s2 vào cuối xâu s1. 
strcmp(s1,s2): so sánh s1 và s2, kết quả trả về: 
0 nếu xâu s1 = xâu s2. 
<0 nếu s1<s2 
>0 nếu s1>s2 
20 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.3.4. Con trỏ và xâu ký tự 
Xâu là một mảng một chiều có kiểu ký tự 
 Xâu có mối liên hệ mật thiết với con trỏ. 
 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 
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); 
} 
21 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Bài tập 
Viết chương trình yêu cầu nhập một xâu và kiểm tra xem xâu đó có đối xứng hay không? 
Xâu đối xứng: Viết ngược hay viết xuôi đều cho kết quả giống nhau 
ThhT 
22 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Kiểm tra tính đối xứng 
#include 
#include 
#include 
void main() { 
 char chuoi[125]; int i = 0, j; 
 printf("\nNhap vao chuoi kiem tra : "); 
 gets(chuoi); 
 j = strlen(chuoi) - 1; 
 while ((chuoi[i] == chuoi[j]) && (i<j)) 
 { i++; j--; 
 } 
 if (i>=j) 
 	printf("Chuoi doi xung"); 
 else 
	 	printf("Chuoi khong doi xung"); 
 getch(); 
} 
23 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Kiểm tra tính đối xứng 
Sửa chương trình thành hàm doiXung 
Trả về 0 nếu không đối xứng 
Trả về 1 nếu đối xứng 
 Nguyên mẫu: int doiXung(char*); 
24 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
#include 
#include 
int doiXung(char*); 
void main() { 
 char chuoi[125]; 
 printf("\nNhap vao chuoi kiem tra : "); 
 gets(chuoi); 
 if (doiXung(chuoi)) 
	printf("Chuoi doi xung"); 
 else 
	printf("Chuoi khong doi xung"); 
 getch(); 
} 
25 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
int doiXung(char *chuoi) 
{ 
 int i = 0, j; 
 j = strlen(chuoi) - 1; 
 while ((chuoi[i]==chuoi[j]) && (i<j)) 
 { 
	i++; j--; 
 } 
 if (i>=j) 
 	return 1; 
 else 
 	return 0; 
} 
26 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
6.2.4. Thư viện - So sánh, nối xâu 
void main() { 
 char chuoi1[125], chuoi2[125]; int kq; 
 printf("\nNhap vao chuoi 1: "); gets(chuoi1); 
 printf("\nNhap vao chuoi 2: "); gets(chuoi2); 
 kq = strcmp(chuoi1, chuoi2); 
 if (kq==0) 
 	printf(“Chuoi 1 bang chuoi 2 \n"); 
 else 
	printf(“Chuoi 1 khong bang chuoi 2 \n”); 
 printf(“Chuoi 2 ghep voi chuoi 2 la: %s”, 	strcat(chuoi1,chuoi2)); 
 getch(); 
} 
27 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Bài tập 
Viết chương trình đổi ngược một xâu từ chữ hoa thành chữ thường và ngược lại 
Ví dụ 
Nhap vao chuoi can chuyen: Truong DHBKHN 
Chuoi “Truong DHBKHN” doi thanh “tRUONG dhbkhn” 
28 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Đổi ngược chữ hoa chữ thường 
/* Doi nguoc chu hoa chu thuong */ 
#include 
#include 
#include 
#include 
void main() { 
 char chuoi[125], chuoikq[125]; 
 int i = 0, j, k; 
 printf("\nNhap vao chuoi can chuyen: "); 
 gets(chuoi); 
 strcpy(chuoikq, chuoi); 
29 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Đổi ngược chữ hoa chữ thường (2) 
 while (chuoikq[i] !='\0') 
 { 
	if (islower(chuoikq[i])) 
 	chuoikq[i] = toupper(chuoikq[i]); 
 	else 
 	chuoikq[i] = tolower(chuoikq[i]); 
	i++; 
 } 
 printf(“Chuoi \”%s\” chuyen sang la \”%s\” 	\n", chuoi, chuoikq); 
 getch(); 
} 
30 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Đổi ngược chữ hoa chữ thường (3) 
Sửa chương trình thành hàm doiNguoc 
Trả về một xâu đổi ngược chữ hoa chữ thường 
 Nguyên mẫu: char *doiNguoc(char*) 
31 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
#include 
#include 
#include 
#include 
char *doiNguoc(char*); 
void main() { 
 char chuoi[125], *chuoikq; 
 printf("\nNhap vao chuoi goc: "); gets(chuoi); 
 chuoikq = doiNguoc(chuoi); 
 printf(“Chuoi \”%s\” chuyen sang la 	\”%s\”\n", chuoi, chuoikq); 
 getch(); 
} 
32 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
char *doiNguoc(char *chuoi) 
{ 
 char kq[125] = ""; int i=0; 
 while (chuoi[i] !='\0') 
 { if (islower(chuoi[i])) 	kq[i]=toupper(chuoi[i]); 
 else 
	kq[i]=tolower(chuoi[i]); 
 i++; 
 } 
 return kq; 
} 
33 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Bài tập 
Viết hàm catKyTuTrongThua 
Mục đích: Cắt các ký tự trống thừa trong chuỗi: Đầu, cuối và giữa (nếu có 2 ký tự trắng liền nhau) 
Nguyên mẫu: 
char *catKyTuTrongThua(char*) 
Viết hàm main() để nhập một xâu, gọi hàm trên để cắt các ký tự trống thừa, sau đó hiển thị kết quả sau khi cắt. 
34 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
#include 
#include 
#include 
#include 
char *catKyTuTrongThua(char*); 
void main() { 
 char chuoi[125], *chuoikq; 
 clrscr(); 
 printf("\nNhap vao chuoi goc: "); 
 fflush(stdin); gets(chuoi); 
 chuoikq = catKyTuTrongThua(chuoi); 
 printf("Chuoi \"%s\"", chuoi); 
 printf("da cat ky tu trong thua la "); 
 printf("\"%s\"\n", chuoikq); 
 getch(); 
} 
35 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
char *catKyTuTrongThua(char* s){ 
	char *kq; int k = 0, i; 
 for (i = 0; i<(strlen(s)); i++) 
	{ 
	if (((s[i] != ' ') || 
 (s[i]==' ' && s[i+1]!= ' ') 
	&& k!=0 && i != strlen(s)-1)) 
	 kq[k++]= s[i]; 
	} 
	if (kq[k-1]==' ') 
	 kq[--k] = '\0'; 
	else 
	 kq[k]='\0'; 
	return kq; 
} 
36 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
char *catKyTuTrongThua(char* s){ 
	char *ls, kq[125]=""; int k = 0; 
	ls = s; 
	while (*ls == ' ') ls++; 
	while (*ls != '\0') { 
	if (*ls!=' '||(*ls==' '&&*(ls-1)!=' ')) 
	kq[k++] = *ls; 
	ls++; 
	} 
	if (kq[k-1]==' ') 
	 kq[--k] = '\0'; 
	else 
	 kq[k]='\0'; 
	return kq; 
} 
37 
Nguyễn Thị Thu Trang, SE-FIT-HUT 
Câu hỏi? 

File đính kèm:

  • pptbai_giang_tin_hoc_dai_cuong_phan_2_lap_trinh_bang_ngon_ngu_c.ppt