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