34
CHƯƠNG VII:CHUỔI

CHƯƠNG VII:CHUỔI

  • Upload
    amma

  • View
    38

  • Download
    0

Embed Size (px)

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 Presentation

Citation preview

Page 1: CHƯƠNG VII:CHUỔI

CHƯƠNG VII:CHUỔI

Page 2: 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];

Page 3: CHƯƠNG VII:CHUỔI

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]

Page 4: CHƯƠNG VII:CHUỔI

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>

Page 5: CHƯƠNG VII:CHUỔI

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";

Page 6: CHƯƠNG VII:CHUỔI

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 ”>

Page 7: CHƯƠNG VII:CHUỔI

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()

Page 8: CHƯƠNG VII:CHUỔI

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)

Page 9: CHƯƠNG VII:CHUỔI

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

Page 10: CHƯƠNG VII:CHUỔI

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;}

Page 11: CHƯƠNG VII:CHUỔI

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

Page 12: CHƯƠNG VII:CHUỔI

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’)

Page 13: CHƯƠNG VII:CHUỔI

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();

}

Page 14: CHƯƠNG VII:CHUỔI

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.

Page 15: CHƯƠNG VII:CHUỔI

void strcopy(char st1[], char st2[])

{

int i=0;

while (st2[i] != ‘\0’)

{

st1[i]=st2[i];

i++;

}

st1[i]=’\0’;

return;

}

Page 16: CHƯƠNG VII:CHUỔI

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();

}

Page 17: CHƯƠNG VII:CHUỔI

CON TRỎ và CÁC HÀM TRÊN CHUỖI

Page 18: CHƯƠNG VII: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++);}

Page 19: CHƯƠNG VII:CHUỔI

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++);}

Page 20: CHƯƠNG VII:CHUỔI

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”)

Page 21: CHƯƠNG VII:CHUỔI

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

Page 22: CHƯƠNG VII:CHUỔI

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)

Page 23: CHƯƠNG VII:CHUỔI

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

Page 24: CHƯƠNG VII:CHUỔI

#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);

Page 25: CHƯƠNG VII:CHUỔI

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();}

Page 26: CHƯƠNG VII:CHUỔI

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’)

Page 27: CHƯƠNG VII:CHUỔI

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

Page 28: CHƯƠNG VII:CHUỔI

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

Page 29: CHƯƠNG VII:CHUỔI

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

Page 30: CHƯƠNG VII:CHUỔI

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();}

Page 31: CHƯƠNG VII:CHUỔI

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

Page 32: CHƯƠNG VII:CHUỔI

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);

Page 33: CHƯƠNG VII:CHUỔI

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();}

Page 34: CHƯƠNG VII:CHUỔI

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));

}