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 N
Trang 1TIN 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Ö
INFORMATION TECHNOLOGY
Trang 2BÀ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ự
Trang 36.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’.
Trang 4BÀ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ự
Trang 56.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];
Trang 66.2.1 Khai báo xâu ký tự (2)
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 */
Trang 76.2.2 Truy cập vào một phần tử của xâu
Trang 8scanf(“%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)
Trang 96.2.3 Nhập/xuất xâu ký tự - gets() & printf()
/* Minh hoa cach su dung gets() & printf() */
Trang 106.2.3 Nhập/xuất xâu ký tự - scanf() & puts()
/* Minh hoa cach su dung scanf() & puts() */
#include <stdio.h>
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();
}
Trang 11BÀ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ự
Trang 126.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
Trang 136.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
Trang 146.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
Trang 156.3.2 Các hàm xử lý xâu ký tự
Vào ra dữ liệu
liệu cho xâu và hiển thị dữ liệu chứa trong
xâu.
scanf(“%s”, ten_xau);
gets(ten_xau);
printf(“%s”, ten_xau);
puts(ten_xau);
Trang 166.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
printf("Nhap chuoi: "); gets(ten);
printf("Chuoi vua nhap: "); puts(ten);
getch();
return 0;
}
Trang 176.3.3 Một số hàm xử lý xâu ký tự khác
size_t strlen(char* tên_xâu);
tên_xâu.
char* strcpy(char* xâu_đích, char* xâu_nguồn)
int strcmp(char* xâu_thứ_nhất, char*
xâu_thứ_hai);
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);
2 xâu xâu_nguồn và xâu_đích
Trang 186.3.3 Một số hàm xử lý xâu ký tự khác
char* strchr(char* str, int ch);
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);
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)
thành số nguyên tương ứng.
số nguyên chuyển đổi được, ngược lại trả về giá trị
0
Trang 196.2.4 Thư viện <string.h>
Thư viện <string.h> 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.
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.
Trang 206.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 thông qua một con trỏ.
Trang 22Kiểm tra tính đối xứng
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main() {
char chuoi[125]; int i = 0, j;
printf("\nNhap vao chuoi kiem tra : ");
Trang 23Kiể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*);
Trang 25int doiXung(char *chuoi)
Trang 266.2.4 Thư viện <string.h> - 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();
}
Trang 27Bà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
Trang 28Đổi ngược chữ hoa chữ thường
/* Doi nguoc chu hoa chu thuong */
Trang 29Đổi ngược chữ hoa chữ thường (2)
Trang 30Đổ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
Trang 31char chuoi[125], *chuoikq;
printf("\nNhap vao chuoi goc: ");
Trang 32char *doiNguoc(char *chuoi)
Trang 33Bà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.
Trang 35(s[i]==' ' && s[i+1]!= ' ')
&& k!=0 && i != strlen(s)-1)) kq[k++]= s[i];
Trang 37Câu hỏi?