บทที่ 07 สตริง(string)

9

Click here to load reader

Transcript of บทที่ 07 สตริง(string)

Page 1: บทที่ 07 สตริง(string)

!

!

บทที่ 7สตริง(string)

♦ !ความหมายของ stringสตริง (string) หมายถึง ชุด(array)ของตัวอักขระ(character) ท่ีเรียงตอกัน สตริงจะเปนค ําหรือ

ขอความที่มีความหมาย ใน C++ ไมมีชนิดขอมูลประเภท string การก ําหนด string คือการก ําหนดเปนอารเรยของขอมูลชนิด char หลาย ๆ ตัวนํ ามาเช่ือมตอกันเปน string เชน character'C','o','m','p','u','t','e','r' เก็บไวในอารเรยรวมเปนขอมูล string ซึ่งจะไดขอความ "Computer" ขอมูลstring เปนไดทั้งคาคงที(่constant) และตัวแปร (variable)

♦ !การกํ าหนดคาคงท่ีให stringวิธีการกํ าหนดตัวแปรประเภท char ใหเปนอารเรยเพ่ือใหเก็บคาคงท่ี string มีรูปแบบดังน้ี1. ประกาศตัวแปรอารเรยประเภท char ไมระบุขนาดของอารเรย และกํ าหนดคา มีรูปแบบดัง

น้ีchar string_name[] = "string or text";โดยที่ char คือ ประเภทขอมูลของสตริงเปน characterstring_name[] คือ ช่ือของตัวแปรสตริง โดยที ่[ ] กํ าหนดใหเปนอารเรยของสตริง

ไมระบุขนาดของอารเรย C++ Compiler จะตรวจสอบและกํ าหนดขนาดจากคาคงท่ีดานขวาของเคร่ืองหมายเทากับ

"string or text" คือ ขอความหรือสายอักขระท่ีเปนคาคงท่ีของสตริง ตองเขียนไวในเคร่ืองหมาย " " เสมอ (ถาเปนคาคงที่ประเภท char คาคงท่ีเขียนไวในเคร่ืองหมาย ' ' ) เชน

char name[] = "Sirichai Namburi";char str[] = "C++ is OOP language";เน่ืองจากสตริงเปนอารเรยของ char จึงสามารถก ําหนดคาคงที่ไดอีกวิธีหนึ่ง คือchar name[] = {'S','i','r','i','c','h','a', 'i',' ','N','a','m','b','u','r', 'i','\0'};ส ําหรับ '\0' หมายถึงเครื่องหมาย null ซึ่งใชเปนรหัสจบสตริงในภาษา C++

2. ประกาศตัวแปรอารเรยประเภท char โดยระบุขนาดของอารเรยและกํ าหนดคา มีรูปแบบดังน้ี

char string_name[n] = " string or text";

Page 2: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

97

โดยที ่ n คือ ขนาดของอารเรย 1 มิติ เชนchar name[31]; //ตัวแปร name สามารถเกบ็อักขระได 30 ตัว ตัวท่ี 31 ใชเก็บ '\0'char location[50]; //ตัวแปร location สามารถเกบ็อักขระได 49 ตัว ตัวท่ี 50 ใชเก็บ '\0'

♦ !การรับคาสตริงจากคียบอรดใน C++ การรับคาสตริงจากคียบอรดเพ่ือเก็บไวในตัวแปร เชน กรอกชื่อนักศึกษา ที่อยูนัก

ศึกษา สามารถใช operator คือ >> (extraction or get from) รับขอมูลทางคียบอรดได และจะเพิ่ม'\0' เปนการจบสตริงใหโดยอัตโนมัติ

• ! ตัวอยางโปรแกรม str_exp1.cpp เปนการรับขอมูลทางคียบอรด ดวย cin>> โดยขณะกรอกหามเวนชองวาง และ setw() จากไฟล iomanip.h กํ าหนดความยาวของสตริงท่ีสามารกรอกได

/*Program : str_exp1.cpp Process : enter string from keyboard with non-space*/ #include <iostream.h> #include <conio.h> #include <iomanip.h>

void main() { char name[31],address[51]; clrscr(); cout<< "Please enter your information : \n"; cout<< "Your Name (1-30 char) : "; cin>>setw(31)>>name; cout<< "Your address (1-50 char): "; cin>>setw(51)>>address; //display clrscr(); cout<< "Your information : \n"; cout<< "Your Name : "<<name<<endl; cout<< "Your address : "<<address<<endl; getch();}

Page 3: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

98

• ! ตัวอยางโปรแกรม str_exp2.cpp แสดงการกรอกโดยใหสามารถรับขอมูลท่ีมีชองวาง(space) เขาไปเก็บในตัวแปร string ได ใหใช member function คือ cin::get() ตอไปนี้

/*Program : str_exp2.cpp Process : enter string with space from keyboard by cin::get() */ #include <iostream.h> #include <conio.h>

void main() { char name[31],address[51]; clrscr(); cout<< "Please enter your information : \n"; cout<< "Your Name (1-30 char) : "; cin.get(name,31); //display clrscr(); cout<< "Your information : "<<endl; cout<< "Your Name : "<<name<<endl;getch(); }

• ! ตัวอยางโปรแกรม str_exp3.cpp กรณีตองการกรอกขอมูลสตริงขนาดยาว หลายบรรทัดสามารถใช cin.get(variable,length,'code') เชน cin.get(resume,1000,']') เพ่ือกรอกขอมูลในลักษณะหลายบรรทัดเก็บไวในตัวแปร resume มีความยามขอความไมเกิน 1000 แตละบรรทัดจบดวยการกด enter และส้ินสุดการกรอกดวยรหัส ] ท่ีกํ าหนดไว ตอไปนี้

/*Program : str_exp3.cpp Process : enter string from keyboard by cin::get() */ #include <iostream.h> #include <conio.h> void main() { char resume[1000]; clrscr(); cout<< "Please enter your information : \n"; cout<< "Your resume (1-200 char) key ] stop enter: "<<endl; cin.get(resume,1000,']'); //stop enter with character ] //display clrscr(); cout<< "Your resume information : "<<endl<<resume; getch(); }

Page 4: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

99

• ! ตัวอยางโปรแกรม str_gets.cpp แสดงการใชฟงกชัน gets() จาก Header file ชื่อ stdio.hทํ าหนาท่ีรับคา string หลาย ๆ คร้ังตอกันไปทางคียบอรด แลวนํ ารายละเอียดใน stringท้ังหมดมาแสดงผล โดยเขียนแยกเปนฟงกชัน ดังนี้

/*Program : str_gets.cpp Process : input string from keyboard by gets() function from stdio.h */

#include <iostream.h>#include <conio.h>#include <stdio.h> //standard input/output function

//declaration prototype functionvoid input();void display();//declaration global variablechar code[9],name[30],address[80];

void main(){ clrscr();input(); clrscr();display();}void input(){ cout<<"Input a string information: \n"; cout<<"Code : "; gets(code); cout<<"Name: "; gets(name); cout<<"Address : "; gets(address);}void display(){ cout<<"Your string information : \n\a"; cout<<"Code : "<<code<<endl; cout<<"Name: "<<name<<endl; cout<<"Address : "<<address<<endl; getch();}

Page 5: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

100

♦ !อารเรย 2 มิติของ Stringขอมูลสตริงใน C++ หมายถึง ชุดอารเรย 1 มิติของขอมูลชนิด char น้ันเอง มีวิธีการก ําหนด

ดังไดกลาวมาแลว เชน char name[30]ถาตองการท ําขอมูลสตริงใหเปนชนิดอารเรย สามารถเก็บขอมูลพรอมกันไดหลาย ๆ สตริง

ตองก ําหนดโดยใชรูปแบบของ อารเรย 2 มิติ ชนิด char มีรูปแบบก ําหนดดังน้ีchar string_name[row][column];ซึ่ง string_name คือ ช่ือของอารเรยสตริง

[row] คือ จํ านวนสมาชิกในแนวแถวของสตริง[column] คือ ความยาวสูงสุดของสตริงในแตละรายการ

เชนchar name[5][31];ตัวแปร name สามารถเก็บขอความหรือสตริงได 5 รายการ แตละรายการมีความยาว

ไมเกิน 30 อักขระการกํ าหนดคาใหกับอารเรยของสตริงแตละรายการ ตองกํ าหนดผายฟงกชัน string copy ท่ี

กํ าหนดไวใน Header file ท่ีช่ือ string.h มีรูปแบบ ดังนี้

strcpy(string_variable , string_value);

โดยที ่string_variable คือ ตัวแปรท่ีเปนสตริง ใชเก็บคาที่คัดลอกมาจาก string_value ซึ่งอาจเปนคาคงท่ีอยูในเคร่ืองหมาย " " หรือเปนตัวแปรสตริงก็ได เชน

strcpy(name[0], "Sirichai");strcpy(name[1], "Sompong");strcpy(name[2], "Somsri");strcpy(name[3], name[2]);

สามารถก ําหนดคาของอารเรยสตริงในลักษณะ const ในโปรแกรม มีรูปแบบดังน้ีconst name[][30]={ "Sirichai","Sompong","Somsri","Sombat","Somsak"};

Page 6: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

101

• ! ตัวอยางโปรแกรม str_exp6.cpp แสดงการกํ าหนดคาคงท่ีใหอารเรยสตริง name[5][31]และแสดงผลขอมูลในอารเรย ดังนี้

/*Program : str_exp6.cpp Process : set constant of array string and display */

#include <iostream.h> #include <conio.h>

void main() { const char name[5][31]={"Sirichai","Sompong","Somsri","Somsak","Sombat"}; int i; clrscr(); //display clrscr(); for(i=0;i<=4;++i) { cout<<name[i]<<endl; } getch(); }

• ! ตัวอยางโปรแกรม str_exp7.cpp แสดงการรับขอมูลทางคียบอรดเก็บไวตัวแปรอารเรยสตริง และแสดงผลขอมูลในอารเรยสตริงทางจอภาพ

/*Program : str_exp7.cpp Process : enter constant to array string and display */ #include <iostream.h> #include <conio.h> void main() { char name[5][31]; int i; clrscr(); cout<<"Please enter student name 5 persons : "<<endl; for(i=0;i<=4;++i) //input string { cout<<"#"<<i+1<<" "; cin>>name[i]; }

Page 7: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

102

//display clrscr(); cout<<"Name of student \n\a"; for(i=0;i<=4;++i) { cout<<"#"<<i+1<<" "<<name[i]<<endl; } getch(); }

♦ !ฟงกชันคัดลอกและนับความยาวของสตริงใน string.h• ! การคัดลอกสตริง หมายถึงการคัดลอกคาคงที่ของสตริงที่เปนตนฉบับ (source) ไปไวอีกตัวแปรสตริงหน่ึงเรียกวา สตริงปลายทาง (destination) มีรูปแบบฟงกชันดังนี้

strcpy(destination,source) เชน strcpy(name,"Sompong");• ! การนับความยาวของสตริง วามีกี่ตัวอักขระใชฟงกชัน strlen(string) เชน

n = strlen(name); หรือ n= strlen("Somsri");

• ! ตัวอยางโปรแกรม str_exp8.cpp แสดงการใชฟงกชัน strcpy() และ strlen()

/*Program : str_exp8.cpp Process : using function strcpy() and strlen()*/

#include <iostream.h>#include <conio.h>#include <iomanip.h> //for setw()#include <string.h> //for strcpy(),strlen()

void main() { char sname[31]; char dname[31]; int n; clrscr(); cout<< "Please enter your information : \n"; cout<< "Your Name (1-30 char) : "; cin>>setw(31)>>sname; strcpy(dname,sname); n=strlen(dname);

Page 8: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

103

//display clrscr(); cout<< "Your information : \n"; cout<< "Your Name : "<<dname<<endl; cout<< "Your name long "<<n<<" characters"; getch(); }

♦ !ฟงกชัน strncpy() , strcat() และ strcmp() ใน string.h• ! ฟงกชัน strncpy(destination,source,n) ใชคัดลอกของสตริงจาก source ไปไวยัง

destination โดยที ่ n คือ จํ านวน character ที่จะท ําการคัดลอกจาก source ไปยังdestination โดยเร่ิมนับจาก character ตัวแรก

• ! ฟงกชัน strncat(t,s,n) ใชในการคัดลอกอักขระหรือขอความจาก string s มาเช่ือตอกับstring t จํ านวน n ตัว แลวเก็บไวใน string t

• ! ฟงกชัน strcmp(string1,string2) ใชเพื่อเปรียบเทียบ string1 กับ string2 ถาผลการเปรียบเทียบเปน 0 แสดงวาเทากัน ถาผลการเปรียบเทียบมากกวา 0 แสดงวา string1>string2และถาผลเปรียบเทียบนอยกวา 0 แสดงวา string1<string2

• ! ตัวอยางโปรแกรม strn_cat.cpp แสดงการการใชฟงกชัน strncpy(), strncat() และstrcmp()

/*Program: strn_cat.cpp process: display used function strncpy(),strncat(),strcmp() from string.h*/#include <iostream.h>#include <conio.h>#include <string.h>

void main(){ char name[20]="Sirichai Namburi"; char std[20]="Sompong Deemak"; char str[40]="Name: ",temp[30]=""; clrscr(); //used strncpy() strncpy(temp,name,12); cout<<temp<<endl; strncpy(temp+12,"buri",10);

Page 9: บทที่ 07 สตริง(string)

!

ศิริชัย นามบุรี สตริง(string)

104

cout<<temp<<endl<<endl; //used strncat() cout<<str<<endl; strncat(str,std,7); cout<<str<<endl; cout<<str<<endl; strncat(str,name,8); cout<<str<<endl<<endl; //used strcmp cout<<strcmp("Som","Som")<<" "<<"Som == Som"<<endl; cout<<strcmp(std,"Sombat")<<" "<<std<<">"<<"Sombat"<<endl; cout<<strcmp(std,"Somsak")<<" "<<std<<"<"<<"Somsak"<<endl; getch();}

♦ !แบบฝกหัดทายบท

1. ใหเขียนโปรแกรมเพื่อสรางฟงกชันจัดการกับขอมูลแบบสตริง ดังน้ี- Length( ) ท ําหนาที่ในการนับจ ํานวนอักขระใน string และพิมพความยาวของสตริงบนจอภาพ- Center() ท ําหนาที่ในการพิมพสตริงกลางจอภาพ ณ ตํ าแหนงท่ี cursor ชี้อยู- Convert() ท ําหนาที่ในการจัดเรียงอักขระในสตริงจากตัวสุดทายมายังตัวแรก

2. ใหเขียนโปรแกรมเพ่ือรับขอมูล รหัส ชื่อนักศึกษา คะแนนระหวางภาค คะแนนปลายภาค ของนักศึกษาจํ านวน 10 คน และแสดงผลขอมูลทั้งหมด พรอมคะแนนรวมของนักศึกษาแตละคนโดยเขียนโปรแกรมแยกเปนฟงกชันตามความเหมาะสม

3. ใหเขียนโปรแกรมรับขอมูลสตริง จํ านวน 5 ขอความ จัดเรียงขอมูลสตริงทั้ง 5 ขอความนั้นจากนอยไปมาก และจากมากไปนอย พรอมแสดงทางจอภาพ โดยสรางฟงกชันในการท ํางานใหเหมาะสม