Professional Documents
Culture Documents
CLang Lect12
CLang Lect12
huydq@soict.hust.edu.vn
Biểu diễn trong bộ nhớ
• Nhắc lại:
– Các ô trong bộ nhớ được đánh địa chỉ
– Một khai báo biến cho phép dành một “ô” để
chứa giá trị
ch = ‘B’;
0 x1 FFE 0 x1 FFF 0 x2 0 0 0 0 x2 0 0 1 0 x2 0 0 2
‘B’ etc
ch
Biểu diễn chuỗi kí tự
• 1 chuỗi được biểu diễn bởi 1 mảng kí tự
• Mỗi phần tử của mảng chứa 1 char
• Tên chuỗi là địa chỉ trỏ đến phần tử đầu
tiên của mảng
name
= 0x2000
name A n n \0
= 0x2000
name A n n \0
= 0x2000
0x2 000 0x2003
Chú ý:
char name[] = ‘Ann’; Không có kí tự kết
thúc xâu (‘\0’)
name A n n
= 0x2000
0x2 000 0x2 002
Khai báo chuỗi (tiếp)
Khai báo 3:
char *name = “Ann”;
0x3000 A n n \0
name
return 0;
}
Kí tự trong xâu
0 x3 9 9 5 0x399C
name J o h n \0
= 0x3995
index 0 index 2
o u t p u t : Char a t i n d e x 2 i s h .
Chương trình đếm kí tự
• Đếm số kí tự không phải là kí tự trắng trong 1 chuỗi
được nhập vào
#include <stdio.h>
int main()
{
char str[80];
int dem, i;
dem = 0; i = 0;
while ( str[i] != '\0' ) {
if ( str[i] != ' ' ) dem++;
i++;
}
printf(“So ki tu khac trang trong xau la %d", dem);
return 0;
}
Xử lí chuỗi
• #include <string.h>
• Phải sử dụng các hàm thư viện cho các thao
tác xử lí chuỗi:
– Gán: strcpy()
– Nối chuỗi: strcat()
– So sánh: strcmp()
– Lấy độ dài xâu: strlen()
– v.v.
Gán chuỗi
#include <stdio.h>
#include <string.h>
int main()
{
char string1[MAXLENGTH];
char string2[MAXLENGTH];
return 0;
}
Không đủ bộ nhớ
char name[] = “Ann”;
strcpy(name, “David”);
name A n n \0
name D a v i d \0
Gán dạng con trỏ
char *name1 = “Ann”;
char *name2 = “Dave”;
0x2000 A n n \0
name1
0x3990 D a v e \0
name2
0x2000 A n n \0
name1
0x2000 D a v e \0
name2
char string1[80];
char string2[80];
strcpy(string1, “Goodbye”);
strcpy(string2, “, Cruel ”);
strcat(string1, string2);
strcat(string1, string2);
strcat(string1, “World!”);
strcpy(name, “Ann”);
strcat(name, “ Smith”);
name A n n \0
= 0x2000
A n n S m i t h \0
So sánh chuỗi
Trả về
0 : nếu string1 giống string2
strcpy(string1, “Apple”); < 0: nếu string1 < string2
strcpy(string2, “Wax”); > 0: nếu string1 > string2
if (strcmp(string1, string2) < 0)
{
printf(“%s %s\n”, string1, string2);
}
else
{
printf(“%s %s\n”, string2, string1);
}
o u t p u t : Apple Wax
Lỗi về so sánh
hoten+i+1
hoten T r a n T i e n \0
Vị trí kí tự trắng
được tìm thấy (i=4)
Chương trình tách tên (tiếp)
Khai báo const thể hiện
#include <stdio.h> giá trị của tham số không
#include <string.h> bị thay đổi trong hàm
int main()
{
char hoten[80];
return 0;
}
Bài tập
• Viết chương trình với các hàm xử lí xâu
được tạo ra để làm các việc sau:
– Cắt bỏ các dấu cách thừa trong 1 xâu
– Đếm số từ hiện có trong 1 xâu
– Đảo ngược thứ tự các kí tự hiện có của
một xâu
– Tách 1 xâu họ và tên thành 2 xâu mới
cho phần họ và phần tên