Tải bản đầy đủ (.pptx) (35 trang)

Bài giảng Lập trình C nâng cao‎: Chương 4 - Trần Minh Thái

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (292.92 KB, 35 trang )

Chương 4. Xử lý
chuỗi ký tự
TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 08 tháng 04 năm 2015


Nội dung
#2

Khái niệm
Khai báo
Các hàm xử lý chuỗi
Bài tập


Khái niệm
#3

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


Khái niệm


#4

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 ký tự ‘\0’.
Ví dụ: Chuỗi “NGUYEN VAN A” được lưu
‘N’ ‘G’ ‘U’ ‘Y’
0

1

2

3

‘E’
4

‘N’ ‘ ‘
5

6

‘V’ ‘A’
7

 Chuỗi gồm 13 ký tự

4


8

‘N’ ‘ ‘
9

10

‘A’

‘\0’

11

12


Khai báo chuỗi
#5

Cách 1: Con trỏ hằng
char < Tên chuỗi > [< Số ký tự tối đa>] ;
Ví du: char str[25];
Ý nghĩa khai báo 1 mảng kiểu ký 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’ )


Khái niệm
#6


Cách 2: Con trỏ
char *< Tên ch̃i >;
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ự


Nhập chuỗi
#7

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);

}


Nhập chuỗi
#8


Lưu ý: Không thể dùng hàm scanf để nhập chuỗi có
khoảng trắng
Giả sử nhập vào chuỗi: “Nguyen Van An”
Ví dụ:
Thì kết quả xuất ra màn hình là: “Nguyen”
void main()
(do str chỉ lưu chuỗi “Nguyen”)
{
char str[80];
printf("Nhap vao chuoi: ");
scanf(“%s”, &str);
printf("Chuoi vua nhap la: %s\n", str);
}


Xuất chuỗi
#9

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”


Các hàm xử lý chuỗi - <string.h>

#10

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


Tính đợ dài của chuỗi
#11

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


Bài tập ví dụ - tính độ dài chuỗi
#12

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?


Bài tập làm thêm – tính độ dài chuỗi
#13

Viết hàm tra xem trong chuỗi có ký 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 ký tự nào xuất
hiện nhiều nhất trong chuỗi


Sao chép chuỗi
#14

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


Sao chép chuỗi
#15


Chép n ký tự từ chuỗi scr sang chuỗi dest. Nếu
chiều dài scr < n thì hàm sẽ điền khoảng trắng cho
đủ n ký 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ả: abc
15


Bài tập ví dụ - sao chép chuỗi
#16

Viết hàm đổi tất cả các ký 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 ký tự trong chuỗi
Ví dụ:
Nhập: ABCDE
Chuỗi sau khi đảo ngược là: EDCBA


Bài tập làm thêm – sao chép chuỗi
#17

Viết hàm đổi tất cả các ký tự có trong chuỗi thành
chữ thường (không dùng hàm strlwr)

Viết hàm đổi những ký tự đầu tiên của mỗi từ
thành chữ in HOA


Nối chuỗi
#18

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


Nối chuỗi
#19

Nối n ký 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



So sánh chuỗi
#20

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 nhỏ hơn s2


So sánh chuỗi
#21

!!! Ký tự HOA < Ký tự thường
VD: ‘A’ < ‘a’ (do mã Ascii ‘A’ = 65, mã Ascii ‘a’ = 97)
Ví dụ:
int kq = strcmp("abc", "ABC")
Giá trị kq > 0


So sánh chuỗi
#22

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


So sánh chuỗi
#23

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


So sánh chuỗi
#24

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


So sánh chuỗi
#25

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


×