lập trình C : Con trỏ và xâu ký tự trong lập trình
Con trỏ và xâu ký tự
- Ký tự.
a. Khái niệm.
Kí tự trong C được bao quanh bởi một cặp dấu nháy đơn ‘ ‘
Ví dụ: ‘a’ ‘d’ ‘1’ là một ký tự.
‘abc’, ‘ab’, ‘fgd’ không là một ký tự.
b. Nhập xuất có định dạng.
Char c;
Scanf(“%c”,&c); // nhập một ký tự từ bàn phím
Printf(“%c”,c); // in một ký tự lên màn hình
c. Vùng đệm nhập xuất ký tự.
•Dùng để đọc và ghi các ký tự ở bảng mã ASCII
•Một vùng đệm (buffer) là một khoảng không gian lưu trữ tạm thời trong bộ nhớ hoặc trên thẻ điều khiển thiết bị.
•Bộ đệm nhập xuất có thể chia làm :
o Console I/O
o Buffered file I/O
a) getchar() : nhập vào một ký tự từ bàn phím và đợi ấn enter
b) getch() : nhập vào một ký tự từ bàn phím hay bộ đệm. Và không hiển thị ký tự lên màn hình. Không cần phải ấn enter.
c) getche() : nhập vào một ký tự từ bàn phím và hiển thị ký tự len màn hình (không đợi ấn enter).
Ví dụ:
Char ch;
Ch=getch(); // đọc từ bàn phím hay bộ đệm 1 ký tự rồi gán cho ch
Ch=getche();// đọc từ bàn phím 1 ký tự rồi gán cho ch
Ch=getchar();// đọc từ bàn phím 1 ký tự rồi gán cho ch
Putchar(<tên biến kí tự>); // in một ký tự lên màn hình
Putchar(ch); // in ký tự lên màn hình
d. Các hàm kiểm tra ký tự.
Khai báo thư viện “ctype.h”
Cách hoạt động một số hàm dưới đây: Nếu thuộc thì hàm cho giá trị khác 0. Nếu không thuộc thì hàm cho giá trị bằng 0.
Int isalpha(int c) : kiểm tra ký tự có là chữ cái không.
Int isdigit(int c) : kiểm tra xem ký tự có là chữ số không.
Int islower(int c): kiểm tra ký tự có là chữ thường không.
Int isupper(int c): kiểm tra ký tự có là chữ hoa không.
Int isspace(int c): kiểm tra ký tự có là trống không (
, dấu cách, ).
Ví dụ :
Char ch; int kt;
Kt= isalpha(ch);
If (kt!=0) printf(“ky tu vua nhap la chu cai”);
Else pritnf(“ky tu vua nhap khong la chu cai”);
•Một số ký tự đặc biệt.
cách in các ký tự đặt biệt
%% : in ra màn hình ký tự ‘%’
: in ra màn hình ký tự ‘’
” : in ra màn hình ký tự ‘ “ ‘
- Mảng và xâu ký tự.
Xâu ký tự được bao quanh bởi một cặp dấu nháy kép “ ”
Ví dụ: “vietsource.net ” , “a”, “1”,… : là một xâu ký tự.
Kí tự ‘ ’ là ký tự cuối cùng của xâu.
Char s[50];
Vì tên xâu (s) là địa chỉ của phần từ đầu tiên &s[0] hay s vì vậy không thể gán xâu cho một hằng ký tự.
S=”vietsource”; cách này sai .
Để gán giá trị cho một xâu ta sử dụng một số cách dưới đây:
Strcpy(s,“vietsource”);
S[0]=’v’; s[1]=’i’; s[2]=’e’; …
Char s[50]=”vietsource.net”;
Char s[]=”vietsource.net”;
Để truy xuất tới một phần tử của mảng ký tự. Hay truy xuất tới một ký tự trong một xâu. Ta truy xuất bình thường như truy xuất tới phần tử của một mảng.
Ví dụ :
S[i]; truy xuất tới ký tự thứ i của xâu s.
s[i]=’v’; gán giá trị cho ký tự thứ i của xâu s.
- Con trỏ và xâu ký tự.
Char *s; // khai báo một con trỏ kiểu char (xâu ký tự)
*(s+i)=’y’; // truy xuất và gán giá trị cho ô nhớ s+i
- Các hàm sử lý xâu ký tự.
gets(char *s); //Hàm dùng để nhập một xâu từ bàn phím.
printf(“%s”,s); //xuất một xâu lên màn hình.
puts(char *s);// hàm xuất một xâu ra màn hình
Khai báo thư viện “string.h” để sử dụng một số hàm dưới
•Int strlen(char *s) trả về độ dài của xâu s;
•Char *strupr(char *s) đổi chữ thường trong xâu s sang chữ hoa.
•Char *strlwr(char *s) đổi chữ hoa sang chữ thường.
•Char *strcat(char *s1, char *s2) nối xâu s2 vào xâu s1;
•Int strcmp(char *s1, char *s2) hàm này cho giá trị âm nếu xâu s1 nhở hơn xâu s2. Và cho giá tị dương nếu xâu s1 lớn hơn xâu s2. Trả về giá trị bằng 0 nếu xâu s1 bằng xâu s2.
•Int strcmpi(char *s1, char *s2) hàm này dùng để so sánh 2 xâu nhưng không phân biệt chữ thường và chữ hoa.
•Char *strcpy(char *s1, char *s2) dung đẻ copy xâu s2 vào xâu s1.
•Char *strncpy(char *s1, char *s2, int n) sao chép n ký tự đầu của xâu s2 sang xâu s1
•Char *strnset(char *s ,int c, int n) dùng để sao chép n lần ký tự c vào xâu s.
•Char *strstr(char *s1, char *s2) tìm sự xuất hiện của xâu s2 trong xâu s1. Nếu tìm thấy hàm cho địa chỉ của xâu con trong xâu s1. Trái lại cho NULL.
•Char *strrev(char *s) dùng đảo ngược xâu s.Nếu thành công hàm cho địa chỉ xâu đã đảo.
Chú ý: cách xoá một ký tự trong xâu.
Ở trên lớp cũng như các trung tâm giảng dạy mình không thấy đề cập đến cách xoá một ký tự. Vậy mình xin hướng dẫn để xoá một ký tự ta làm như sau.
Vi dụ: ta có xâu s=”viet source.net”;
Để xoá dấu cách giữa chữ “viet” và chữ “source.net”. ta phải tìm xem dấu cách đó ở vị trí thứ mấy trong xâu.
Ở đây dấu cách nằm ở vị trí thứ 4. Do
‘V’ : vị trí 0
‘i’ : vị trí 1
…
Để xoá dấu cách ta sử dụng xoá địa chỉ ô nhớ bằng cách copy đè ô nhớ sau lên ô nhớ hiện tại(ô chứa dấu cách)
Strcpy(&s[4],&s[5]); // xoá ký tự s[4] (tức là kí tự dấu cách).
Sau khi xoá ta được một xâu mới:
S==”vietsource.net”;
Bài tập bắt buộc
Bài 1: Vào từ bàn phím một câu từ bàn phím, kết thúc bằng dấu chấm ‘.’ In ra mỗi từ một dòng. Và câu đó có bao nhiêu từ.
Bài 2: Nhập từ bàn phím họ tên một người. In ra màn hình tên người đó
Ví dụ: s=”Nguyen Ba Cuong” in ra man hinh “Cuong”. Cho chương trình chạy lặp vô hạn. Hỏi ấn (“y/n ?”) Nếu ấn phím ‘y’ thì chạy lại. Nếu ấn ‘n’ thì dừng. Nếu ấn các phím khác kể cả enter thì không làm gì và hỏi lại ấn (“y/n ?”).
Bài tập bổ xung
Bài 3: Nhập vào một xâu ký tự từ bàn phím gồm các từ.
Ví dụ: s=” bac ninh que toi”. Lập chương trình bỏ bớt các dấu trống (dấu cách) thừa.(chuẩn hoá xâu).
Sau khi chuẩn hoá ta được : s=”bac ninh que toi”.
Bài 4: nhập một số thập phân, in ra dạng chữ số. Ví dụ: 6513.24, in ra “sau ngan nam tram muoi ba phay hai muoi bon”.
Bài 5: nhập vào từ bàn phím một danh sách quản lý sinh viên gồm: họ tên, mã sinh viên, điểm toán, tin. In ra màn hình tất cả thông tin trên và điểm trung bình của mỗi thí sinh ở dạng bảng gồm 5 cột ứng với 5 mục trên (họ tên, mã sinh vien,…diểm tb).
This topic is now unlisted. It will no longer be displayed in any topic lists. The only way to access this topic is via direct link.