chương 7 - WordPress.com

Download Report

Transcript chương 7 - WordPress.com

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
char <Biến> [Chiều dài tối đa]
•
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.
KHAI BÁO
•Khai báo theo con trỏ
•Cú pháp:
char *<Var_name>
•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.
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:
char <Biến>[ ]=<”Hằng ”>
Ví dụ:
#include<iostream.h>
#include<conio.h>
void main()
{
char Chuoi[]= “Truong Dai Hoc Cong Nghiep TP.HCM” ;
cout<<Chuoi ;
getch();
}
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:
cin.get(<biến >)
Hoặc
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:
cin.getline(st,n)
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
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
cin.ignore(int n, ‘\n’)
• 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.
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
Strcpy(string_var,
string_exp)
Công dụng
Ví dụ
Copy nội dung của chuỗi strcpy(st,”abcd”)
string_exp (biểu thức chuỗi)
sang chuỗi string_var (biến
chuỗi)
strcat(string_var,
string_exp)
Ghép nội dung của chuỗi strcat(test,”abcd”)
str_exp vào cuối chuỗi
string_var
strlen(str_exp)
Trả về chiều dài thực của strlen(“Hello”)
chuỗi, không tính ký tự ‘\0’
Các hàm thao tác với chuỗi
thông dụng
strcmp(str_exp1, So sánh chuỗi str_exp1 và strcmp(“An
str_exp2)
str_exp2, kết quả của h”,”Lan”)
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
Các hàm thao tác với chuỗi
thông dụng
strncpy(str_var,s Copy n ký tự của strncpy(str1
tr_exp,n)
string_exp sang str_var.
,str2,5)
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
Các hàm thao tác với chuỗi
thông dụng
strncmp(str_exp1,str_ so sánh n ký tự đầu của hai strncmp(“He
exp2,n)
chuỗi str_exp1 và str_exp2.
y”,”Head”,
Kết quả trả về của hàm giống
2)
như hàm strcmp
strchr(str_exp,char_e
xp)
Trả về địa chỉ của ký tự đầu strchr(“Hello
tiên trong chuỗi str_exp
”,’e’)
giống với char_exp, hàm có
kết quả NULL nếu char_exp
không có trong str_exp
#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
Công dụng
kết quả của hàm có giá
int isalpha(char_exp) trị khác 0 khi char_exp
là một chữ cái
kết quả của hàm có giá
int isupper(char_exp) trị khác 0 khi char_exp
là một chữ cái hoa
Trả về chiều dài thực
int islower(char_exp) của chuỗi, không tính
ký tự ‘\0’
Tên hàm
Ví dụ
isalpha(‘x’)
isupper(‘a’)
islower(‘a’)
Các hàm thao tác trên ký tự
trong thư viện ctype.h
kết quả của hàm có giá isdigit(‘a’)
int isdigit(char_exp) trị khác 0 khi char_exp
là một ký số
kết quả của hàm có giá isascii(‘a’)
trị khác 0 nếu char_exp
int isascii(char_exp)
là một ký tự có mã
ascii <128
kết quả của hàm có giá isspace(‘ ’)
int isspace(char_exp) trị khác 0 khi char_exp
là một khoảng trắng
Các hàm thao tác trên ký tự
trong thư viện ctype.h
kết quả của hàm có giá isprint(‘a’)
trị khác 0 khi char_exp
int isprint(char_exp)
là một ký tự có thể in
được
kết quả của hàm có giá iscntrl(‘a’)
int iscntrl(char_exp) trị khác 0 khi char_exp
là một ký tự điều khiển
kết quả của hàm có giá ispunct(‘!’)
int ispunCt(char_exp) trị khác 0 khi char_exp
là một ký tự dấu
Các hàm thao tác trên ký tự
trong thư viện ctype.h
Kết quả của hàm là toupper(‘a’)
ký tự hoa tương ứng
int toupper(char_exp) với char_exp
Kết quả của hàm là tolower(‘a’)
ký tự thường tương
int tolower(char_exp) ứng với char_exp
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:
Chuyển một chuỗi sang số atoi(‘123
nguyên. Việc chuyển đổi sẽ a45’)
int atoi(str_exp)
dừng khi gặp ký tự không phải
là ký số
Chuyển một chuỗi sang số
double
double. Việc chuyển đổi sẽ
atof(char_exp) 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:
Chuyển giá trị số nguyên
char*
itoa(int sang dạng chuỗi và gán vào
value, char *st, int vùng nhớ mà con trỏ st
radix)
đ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
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));
}