chƯƠng vii:chuỔi
DESCRIPTION
CHƯƠNG VII:CHUỔI. KHÁI NIỆM. Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã Ascii). Các hằng ký tự được đặt trong cặp dấu nháy kép V í dụ : char jenny [20];. KHAI BÁO. Khai báo theo mảng Ví dụ : - PowerPoint PPT PresentationTRANSCRIPT
CHƯƠNG VII:CHUỔI
KHÁI NIỆM
• Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã Ascii).
• Các hằng ký tự được đặt trong cặp dấu nháy kép Ví dụ : char jenny [20];
KHAI BÁO
• Khai báo theo mảng
• Ví dụ:
char Ten[12]; Trong khai báo này, bộ nhớ sẽ cung cấp 12+1 bytes để lưu trữ nội dung của chuỗi ký tự Ten; byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt chuỗi.
char <Biến> [Chiều dài tối đa] char <Biến> [Chiều dài tối đa]
KHAI BÁO
•Khai báo theo con trỏ •Cú pháp:
•Ví dụ:
char *Ten;
Trong khai báo này, bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ của biến con trỏ Ten đang chỉ đến, chưa cung cấp nơi để lưu trữ dữ liệu.
char *<Var_name>char *<Var_name>
Vừa khai báo vừa gán giá trị
• Chuổi ký tự giống như mảng bình thường do đó để khởi tạo một chuổi ký tự với những giá trị xác định ta có thể thực hiện tương tự như với mảng.
• Ví dụ:
char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };Hoặc
char mystring [] = "Hello";
Vừa khai báo vừa gán giá trị Cú pháp:
Ví dụ:#include<iostream.h> #include<conio.h> void main() {
char Chuoi[]= “Truong Dai Hoc Cong Nghiep TP.HCM” ; cout<<Chuoi ; getch();
}
char <Biến>[ ]=<”Hằng ”>char <Biến>[ ]=<”Hằng ”>
CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ
Nhập xuất
Để nhập dữ liệu kiểu ký tự hoặc chuỗi từ bàn phím ta dùng hàm get()
Cú pháp:
Hoặc cin.get(<biến >)cin.get(<biến >)
cin.get()cin.get()
CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ
• Nhập một chuỗi ký tự tối đa n-1 ký tự từ bàn phím dùng hàm getline()
• Cú pháp:
Hàm cho phép nhập vào biến st (st là một mảng char) n-1 ký tự, nếu nhập hơn thì phần ký tự còn lại sẽ để trên vùng đệm
cin.getline(st,n)cin.getline(st,n)
Lưu ý
Ta cũng có thể dùng cin để nhập ký tự hoặc chuỗi nhưng trong trường hợp này nó không cho phép nhập ký tự trắng hoặc chuỗi có ký tự trắng
Ví dụ :#include <iostream.h>#include <conio.h>void main(){
const int MAX=10;char st[MAX];cout <<"Nhap mot chuoi toi da “<<(MAX-1)<<” ky tu ";cin.getline(st,MAX);cout <<”Chuoi vua nhap la :” <<st;getch();
return;}
Lưu ý:
• Khi nhập dữ liệu nếu chúng ta nhập quá số ký tự qui định (MAX-1) thì có thể ảnh hưởng đến những lệnh nhập sau hoặc có thể làm ảnh hưởng đến hoạt động của máy tính.
• Để tránh tình trạng này thường sau khi nhập dữ liệu bằng cin, cin.get, cin.getline ta sử dụng hàm cin.ignore
Lưu ý:
• Cú pháp
• Công dụng của hàm là bỏ qua tối đa n trong vùng đệm hoặc khi gặp phím enter (\n)thì kết thúc lệnh cin.
cin.ignore(int n, ‘\n’)cin.ignore(int n, ‘\n’)
Ví dụ #include <iostream.h>#include <conio.h>#include <iomanip.h>#include <stdlib.h>void main(){
const int MAX=5;char a[MAX],b[MAX],i;clrscr();cout <<"nhap mot chuoi";cin.getline(a,5); //(1)cin.ignore(100,'\n');cout <<"nhap mot chuoi";in.getline(b,5); //(2) cout<<a<<” “<<b;getch();
}
Truy xuất từng ký tự trong chuỗi:
• Do chuỗi là một mảng ký tự vì vậy ta có thể truy xuất chuỗi bằng chỉ số giống như truy xuất mảng.
• Ví dụ:
Xây dựng hàm có hai tham số để nhận hai chuổi sau đó copy nội dung chuỗi thứ hai sang chuỗi thứ nhất.
void strcopy(char st1[], char st2[])
{
int i=0;
while (st2[i] != ‘\0’)
{
st1[i]=st2[i];
i++;
}
st1[i]=’\0’;
return;
}
void main()
{
const int max=30;
char st1[max], st2[max];
int i;
cout<<"nhap chuoi thu nhat:";
cin.getline(st2, max);
cin.ingore(100,'\n');
strcopy(st1,st2);
cout<<"chuoi thu hai la:"<<st2;
getch();
}
CON TRỎ và CÁC HÀM TRÊN CHUỖI
Con trỏ và chuỗi
• Con trỏ rất hữu ích trong việc xây dựng các hàm xử lý chuỗi.
• Khi sử dụng con trỏ để truy xuất chuỗi thay cho chỉ số thì chương trình sẽ cô đọng và hiệu quả hơn.
Ví dụ: Hàm strcopy sử dụng con trỏ.void strcopy(char st1[], char st2[]){
while (*st1++ = *st2++);}
Ví dụ:#include <iostream.h>#include <conio.h>#include <string.h>void strcopy(char st1[], char st2[]);void main(){ const int MAX=80;
char str2[MAX],c,str1[MAX];int i=0;clrscr();cout <<"nhap mot chuoi \n";cin.getline(str2,MAX);cin.ignore(100,'\n');strcopy(str1,str2);cout<<"\n"<<str1;getch();
}void strcopy(char st1[ ], char st2[ ]){
while (*st1++=*st2++);}
Các hàm thao tác với chuỗi thông dụng
Tên hàm Công dụng Ví dụ
Strcpy(string_var, string_exp)
Copy nội dung của chuỗi string_exp (biểu thức chuỗi) sang chuỗi string_var (biến chuỗi)
strcpy(st,”abcd”)
strcat(string_var, string_exp)
Ghép nội dung của chuỗi str_exp vào cuối chuỗi string_var
strcat(test,”abcd”)
strlen(str_exp) Trả về chiều dài thực của chuỗi, không tính ký tự ‘\0’
strlen(“Hello”)
strcmp(str_exp1,str_exp2)
So sánh chuỗi str_exp1 và str_exp2, kết quả của hàm là:
- số âm nếu str_exp1<str_exp2- số =0 nếu str_exp1=str_exp2- số dương nếu str_exp1>str_exp2
strcmp(“Anh”,”Lan”)
Các hàm thao tác với chuỗi thông dụng
Các hàm thao tác với chuỗi thông dụng
strncpy(str_var,str_exp,n)
Copy n ký tự của string_exp sang str_var. Nếu str_exp vượt quá n ký tự thì ký tự ‘\0’ sẽ không được chèn vào cuối chuỗi str_var
strncpy(str1,str2,5)
strncmp(str_exp1,str_exp2,n)
so sánh n ký tự đầu của hai chuỗi str_exp1 và str_exp2. Kết quả trả về của hàm giống như hàm strcmp
strncmp(“Hey”,”Head”,2)
strchr(str_exp,char_exp)
Trả về địa chỉ của ký tự đầu tiên trong chuỗi str_exp giống với char_exp, hàm có kết quả NULL nếu char_exp không có trong str_exp
strchr(“Hello”,’e’)
Các hàm thao tác với chuỗi thông dụng
#include <iostream.h>#include <conio.h>#include <string.h>#include <stdlib.h>void main(){
const int MAX=80;char str2[MAX],c,str1[MAX];int n;clrscr();cout <<"Nhap chuoi thu 1: ";
cin.getline(str1,MAX);if (strlen(str1)>=MAX-1) cin.ignore(100,'\n');cout <<"Nhap chuoi thu 2: ";cin.getline(str2,MAX);n= strcmp(str1,str2);
if (n<0) cout <<str1 <<" nho hon " <<str2<<endl;
else if (n= =0)
cout <<str1 <<" == " <<str2<<endl;else
cout <<str1 <<" lon hon " <<str2<<endl;cout <<"Chieu dai chuoi thu 1 la: "<<strlen(str1)<<endl ;cout<<"Chieu dai chuoi thu 2 la: "<<strlen(str2)<<endl;
strcat(str1,str2); //Sau khi noi chieu dai k0 duoc vuot qua pham vi
cout<<"Sau khi noi str2 vao str1 \n"<<"chuoi 1 la: "<<str1<<endl;
strcpy(str1,str2); cout <<"Sau khi copy noi dung str2 vao str1 \n"cout<<"chuoi 1 la: "<<str1<<endl;
getch();}
Các hàm thao tác trên ký tự trong thư viện ctype.h
Tên hàm Công dụng Ví dụ
int isalpha(char_exp) kết quả của hàm có giá trị khác 0 khi char_exp là một chữ cái
isalpha(‘x’)
int isupper(char_exp)kết quả của hàm có giá trị khác 0 khi char_exp là một chữ cái hoa
isupper(‘a’)
int islower(char_exp)Trả về chiều dài thực của chuỗi, không tính ký tự ‘\0’
islower(‘a’)
int isdigit(char_exp)kết quả của hàm có giá trị khác 0 khi char_exp là một ký số
isdigit(‘a’)
int isascii(char_exp)
kết quả của hàm có giá trị khác 0 nếu char_exp là một ký tự có mã ascii <128
isascii(‘a’)
int isspace(char_exp)
kết quả của hàm có giá trị khác 0 khi char_exp là một khoảng trắng
isspace(‘ ’)
Các hàm thao tác trên ký tự trong thư viện ctype.h
int isprint(char_exp)
kết quả của hàm có giá trị khác 0 khi char_exp là một ký tự có thể in được
isprint(‘a’)
int iscntrl(char_exp) kết quả của hàm có giá trị khác 0 khi char_exp là một ký tự điều khiển
iscntrl(‘a’)
int ispunCt(char_exp)
kết quả của hàm có giá trị khác 0 khi char_exp là một ký tự dấu
ispunct(‘!’)
Các hàm thao tác trên ký tự trong thư viện ctype.h
int toupper(char_exp)
Kết quả của hàm là ký tự hoa tương ứng với char_exp
toupper(‘a’)
int tolower(char_exp)
Kết quả của hàm là ký tự thường tương ứng với char_exp
tolower(‘a’)
Các hàm thao tác trên ký tự trong thư viện ctype.h
Ví dụ#include <iostream.h>#include <conio.h>#include <ctype.h>#include <iomanip.h>void main(){
const int MAX=80;int i;clrscr();for (i=0;i<=255;i++){
if (i%22==0){
getch();clrscr();cout <<setw(3)<<"MaKT"<<setw(8)<<"KT ASCII"<<setw(8)
<<"KT DK"<<setw(8)<<"KT IN"<<setw(8)<<"KT DAU"<<setw(8)<<"KY TU"<<endl;
}cout <<setw(3)<<i<<setw(8)<<isascii(char(i))<<setw(10)
<<iscntrl(char(i))<<setw(7)<<isprint(char(i))<<setw(8)<<ispunct(char(i));if (isprint(char(i))) cout<<setw(7)<<char(i);cout <<endl;
} getch();}
Các hàm chuyển đổi chuỗi trong thư viện stdlib.h:
int atoi(str_exp)
Chuyển một chuỗi sang số nguyên. Việc chuyển đổi sẽ dừng khi gặp ký tự không phải là ký số
atoi(‘123a45’)
double atof(char_exp)
Chuyển một chuỗi sang số double. Việc chuyển đổi sẽ dừng khi gặp ký tự không thể chuyển sang dạng double được
Các hàm chuyển đổi chuỗi trong thư viện stdlib.h:
char* itoa(int value, char *st, int radix)
Chuyển giá trị số nguyên sang dạng chuỗi và gán vào vùng nhớ mà con trỏ st đang trỏ đến. st là một con trỏ kiểu ký tự
Ví dụ:#include <iostream.h>#include <conio.h>#include <stdlib.h>#include <ctype.h>int test_int(char*);int test_float(char *st);
void main(){
const int MAX=10;char str2[MAX];int n; double x;cout <<"nhap mot so nguyen \n"; cin.getline(str2,MAX);if (strlen(str2)>=MAX-1) cin.ignore(100,'\n');if (test_int(str2)){
n=atoi(str2);cout<<'\n'<<n<<endl;
}else
cout <<"Nhap sai";cout <<"nhap mot so double \n"; cin.getline(str2,MAX);if (test_float (str2)){
x=atof(str2);cout<<'\n'<<x<<endl;
}else cout <<"Nhap sai";
getch();}
int test_int(char *st)
{
while (isdigit(*(st))) st++;
return !int(*(st));
}
int test_float(char *st)
{
while (isdigit(*(st))|| *(st)=='.' ) st++;
return !int(*(st));
}