Giáo trình Lập trình bằng ngôn ngữ C - Chương 5: Xâu kí tự - Ngô Văn Linh
Giữa con trỏ kiểu char và mảng kiểu char có sự
khác biệt. Xét ví dụ sau:
char ch[20];
char *pc;
pc = "Dai Hoc Bach Khoa";/*Hợp lệ*/
ch = "Dai Hoc Bach Khoa";/*Không hợp lệ*/
câu lệnh gán đầu tiên là hợp lệ vì pc là con trỏ
kiểu char, còn câu lệnh gán thứ hai không hợp lệ
vì ch được khai báo là một mảng ký tự, do đó ch là
một hằng, chúng ta không thể gán giá trị cho
hằng được.
36 trang |
Chia sẻ: huongthu9 | Lượt xem: 516 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình bằng ngôn ngữ C - Chương 5: Xâu kí tự - Ngô Văn Linh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Chương 5
Xâu ký tự
Ngo Van Linh
Bộ môn Hệ thống thông tin
Viện Công nghệ thông tin và Truyền thông
Đại học Bách Khoa Hà Nội
2Nội dung
5.1. Khái niệm xâu ký tự
5.2. Khai báo và sử dụng xâu
5.2.1. Khai báo xâu ký tự
5.2.2. Truy cập vào một phần tử của xâu
5.3. Một số hàm làm việc với ký tự và xâu ký tự
trong C.
5.3.1. Các hàm xử lý ký tự
5.3.2. Các hàm xử lý xâu ký tự
5.3.3. Một số hàm xử lý xâu ký tự khác
5.3.4. Con trỏ và xâu ký tự
3Nội dung
5.1. Khái niệm xâu ký tự
5.2. Khai báo và sử dụng xâu
5.2.1. Khai báo xâu ký tự
5.2.2. Truy cập vào một phần tử của xâu
5.3. Một số hàm làm việc với ký tự và xâu ký tự
trong C.
5.3.1. Các hàm xử lý ký tự
5.3.2. Các hàm xử lý xâu ký tự
5.3.3. Một số hàm xử lý xâu ký tự khác
5.3.4. Con trỏ và xâu ký tự
45.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'.
55.1. Khái niệm xâu ký tự (tiếp)
Cần phân biệt giữa ký tự và xâu bao gồm một ký
tự. Ví dụ 'A' là ký tự A được mã hóa bằng 1 byte,
trong khi "A" là một xâu ký tự chứa ký tự A xâu
này được mã hóa bằng 2 bytes cho ký tự A và ký
tự '\0'.
Trong C không tồn tại các phép toán so sánh, gán
nội dung của xâu này cho xâu khác. Để thực hiện
các công việc này C cung cấp cho người lập trình
một thư viện các hàm chuẩn, được khai báo trong
tệp header có tên là string.h.
Để sử dụng các hàm thao tác xâu, trên đầu
chương trình cần phải có dòng khai báo #include
6Nội dung
5.1. Khái niệm xâu ký tự
5.2. Khai báo và sử dụng xâu
5.2.1. Khai báo xâu ký tự
5.2.2. Truy cập vào một phần tử của xâu
5.3. Một số hàm làm việc với ký tự và xâu ký tự
trong C.
5.3.1. Các hàm xử lý ký tự
5.3.2. Các hàm xử lý xâu ký tự
5.3.3. Một số hàm xử lý xâu ký tự khác
5.3.4. Con trỏ và xâu ký tự
75.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];
85.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";
9Nội dung
5.1. Khái niệm xâu ký tự
5.2. Khai báo và sử dụng xâu
5.2.1. Khai báo xâu ký tự
5.2.2. Truy cập vào một phần tử của xâu
5.3. Một số hàm làm việc với ký tự và xâu ký tự
trong C.
5.3.1. Các hàm xử lý ký tự
5.3.2. Các hàm xử lý xâu ký tự
5.3.3. Một số hàm xử lý xâu ký tự khác
5.3.4. Con trỏ và xâu ký tự
10
5.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 đề
#include
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.
11
5.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.
12
5.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.
13
5.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);
14
5.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;
}
15
5.3.3. Một số hàm xử lý xâu ký tự khác
Khai báo tệp tiêu đề #include
int 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.
char* strncpy(char* xâu_đích, char* xâu_nguồn, int
n)
Tương tự strcpy() nhưng ngừng sao chép sau n ký tự.
Trong trường hợp không có đủ số ký tự trong xâu nguồn
thì hàm sẽ điền thêm các ký tự trắng vào xâu đích.
16
5.3.3. Một số hàm xử lý xâu ký tự khác
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
int strncmp(char* xâu_thứ_nhất, char* xâu_thứ_hai, int n);
Tương tự như hàm strcmp nhưng giới hạn việc so sánh với n ký tự
đầu tiên của hai xâu.
int stricmp(char* xâu_thứ_nhất, char* xâu_thứ_hai);
Tương tự như strcmp() nhưng không phân biệt chữ hoa hay chữ
thường.
int strnicmp(char* xâu_thứ_nhất, char* xâu_thứ_hai, int n);
Tương tự như hàm stricmp nhưng giới hạn việc so sánh với n ký tự
đầu tiên của hai xâu.
17
5.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* strrchr(char* str, int ch);
Tương tự như strchr() nhưng việc tìm kiếm bắt đầu từ
cuối xâu str.
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.
18
5.3.3. Một số hàm xử lý xâu ký tự khác
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.
char* strncat(char* xâu_đích, char* xâu_nguồn, int n);
Tương tự strcat nhưng chỉ giới hạn với n ký tự đầu tiên của
xâu_nguồn.
char* strlwr(char* xâu)
Chuyển đổi các chữ in hoa trong xâu sang chữ thường.
char* strupr(char* xâu)
Chuyển đổi các chữ thường trong xâu sang chữ in hoa.
19
5.3.3. Một số hàm xử lý xâu ký tự khác
void strset(char* s, char c)
Khởi đầu giá trị tất cả các ký tự của xâu s bằng ký tự c
void strnset(char* s, char c, int n)
Khởi đầu giá trị cho n ký tự đầu tiên của xâu s bằng ký
tự c
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.
20
5.3.4. Con trỏ và xâu ký tự
Như đã biết xâu ký tự là một dãy các ký tự đặt
trong hai dấu nháy kép, ví dụ: "Dai Hoc Bach
Khoa".
Cũng giống như mảng, xâu ký tự là một hằng địa
chỉ biểu thị địa chỉ đầu của mảng ký tự chứa xâu
(Mảng này chứa các ký tự của xâu công thêm ký
tự NULL).
Vì vậy, nếu chúng ta khai báo char *pc; là một con
trỏ kiểu char thì phép gán pc="Dai Hoc Bach
Khoa" là hợp lệ. Sau khi thực hiện câu lệnh này,
trong con trỏ pc có địa chỉ đầu của xâu "Dai Hoc
Bach Khoa".
21
5.3.4. Con trỏ và xâu ký tự
Giữa con trỏ kiểu char và mảng kiểu char có sự
khác biệt. Xét ví dụ sau:
char ch[20];
char *pc;
pc = "Dai Hoc Bach Khoa";/*Hợp lệ*/
ch = "Dai Hoc Bach Khoa";/*Không hợp lệ*/
câu lệnh gán đầu tiên là hợp lệ vì pc là con trỏ
kiểu char, còn câu lệnh gán thứ hai không hợp lệ
vì ch được khai báo là một mảng ký tự, do đó ch là
một hằng, chúng ta không thể gán giá trị cho
hằng được.
22
5.3.4. Con trỏ và xâu ký tự
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
void 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);
}
23
Bài tập
Bài 1: Nhập một xâu kí tự từ bàn phím gồm các
từ, ví dụ "Thu do Ha Noi". Lập chương trình để
bỏ bớt các dấu trống giữa các từ sao cho các từ
chỉ cách nhau ít nhất một dấu trống.
Bài 2: Viết chương trình nhập vào từ bàn phím họ
và tên của một người, sau đó in phần tên ra màn
hình. Ví dụ: "Tran Hung Dao" thì in ra "Dao".
Bài 3: Nhập vào một câu, kết thúc bằng dấu chấm.
In ra câu đó có bao nhiêu từ.
24
Bài chữa bài 2
#include
#include
#include
void main(){
char s[30], *p;
clrscr();
printf("Nhap vao mot xau ho va ten");
gets(s);
/* Dùng hàm strrchr duyệt ngược từ cuối xâu, tìm vị trí đầu tiên của
một ký tự và trả về con trỏ trỏ đến ký tự đó. */
p = strrchr(s,' '); // Tìm ký tự trống đầu tiên từ cuối xâu s
p = p + 1;
printf("\nPhan ten la: %s\n",p);
getch();
}
25
Bài 1
26
#include
#include
#include
int main(int argc, char *argv[])
{
char s[50], t[5]=" ", *p, *q;
int i,j;
printf("Nhap xau: "); fflush(stdin);gets(s);
for(i=0;i<strlen(s);i++){
q = s;
p = strstr(s,t);
27
i = p - q;
if(i<strlen(s)){
j = i++;
do{
s[j] = s[j+1];
j++;
}while(j<strlen(s));
}
}
printf("\nXau la:%s",s);
getch();
return 0;
}
Bài 2 (another way to solve)
28
#include
#include
#include
int main(int argc, char *argv[])
{
char s[50], *p, *q;
int i;
printf("Nhap xau: "); fflush(stdin);gets(s);
p=s;
29
for(i=1;*p!='\0';i++){
p++;
if(*p==' ')q=p;
}
q++;
printf("\nXau la:%s",q);
getch();
return 0;
}
Bài 3
30
#include
#include
#include
int main(int argc, char *argv[])
{
char s[50]; int i, n=1;
printf("Nhap xau: "); fflush(stdin);gets(s);
if(s[strlen(s)-1] !='.') printf("Nhap sai roi!");
else{ for(i=0;i<strlen(s)-1;i++)
if(s[i]!=' ' && s[i+1]==' ') n++;
printf("\nSo tu la: %d\n", n);
}
getch() ;
return 0;
}
Bài 3:
31
#include
#include
#include
void main(){
char s[100]; int i=0,n=0;
printf("Nhap cau:");gets(s);
while(i<strlen(s)){
while(s[i]==' ') i++;
if(i==strlen(s)) break;
while(s[i]!=' ') i++;
n++;
}
printf("\nSo tu la: %d", n);
getch();
}
32
33
34
35
36
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_bang_ngon_ngu_c_chuong_5_xau_ki_tu_ngo.pdf