วัตถุประสงค์เชิงพฤติกรรม (Behavioral Objectives)
หลังจากศึกษาจบบทเรียนนี้แล้ว นักศึกษาจะมีความสามารถดังนี้
(After studying this chapter, you will be able to)

                1. อธิบายและยกตัวอย่างสตริง (String)

                2. แสดงตัวอย่างฟังก์ชัน Input / Output ของสตริง

                3. แสดงตัวอย่างฟังก์ชันอื่นที่ใช้กับสตริง

                4. แสดงการใช้ฟังก์ชัน Strlen

                5. แสดงการเข้าข้อมูลของพอยเตอร์ของสตริง

                6. แสดงการเปรียบเทียบสตริงที่ผลเป็นเท่ากับ,น้อยกว่า และมากกว่า

                7. ยกตัวอย่างแสดงผลของฟังก์ชัน Strncmp

                8. แสดงผลการทำงานของฟังก์ชัน Strcat และ Strncat

                9. จัดบอร์ดเชิงปฏิบัติการ “สตริง”

              10. สนทนาเชิงปฏิบัติการ “การเปรียบเทียบสตริงที่ผลเป็นเท่ากับ น้อยกว่า และมากกว่า”

              11. อธิบายคำศัพท์ได้ 10 คำ



บทที่ 10  สตริง (String)

                สตริงในภาษา C ก็คือ อาร์เรย์ของตัวอักษร ที่มีข้อมูลชนิดตัวอักษรเรียงกันไป แต่จะต้องมีจุดสิ้นสุดด้วย โดยจะใช้ตัวอักษรวางหรือ Null Character เป็นจุดสิ้นสุดของสตริง ซึ่งจะต่างจากอาร์เรย์ปกติที่ไม่ต้องมีจุดสิ้นสุดของอาร์เรย์  ซึ่งแสดงในรูปที่ 1

รูปที่ 1 แสดงความแตกต่างระหว่างสตริงและอาร์เรย์

การเก็บข้อมูลของสตริง
การเก็บข้อมูลของสตริงนั้น จะมีการเก็บข้อมูลอยู่ 2 ส่วน ส่วนแรกจะเป็นข้อมูลตัวอักษรโดยเก็บเรียงกันไป แบะส่วนที่ 2 จะเก็บจุดสิ้นสุดของสตริง ซึ่งจุสิ้นสุดของสตริงจะใช้ Null Characterหรือ ‘\0’ซึ่งในรูปที่ 2 แสดงการเก็บข้อมูลสตริงในหน่วยความจำ

รูปที่ 2 การเก็บข้อมูลของลองสตริงบนหน่วยความจำ
รูปที่ 3 แสดงถึงความแตกต่างระหว่างข้อมูลชนิดตัวอักษรและข้อมูลชนิดสตริงตัวอักษรที่เก็บอยู่ในหน่วยความจำ ข้อมูลชนิดตัวอักษรต้องการหน่วยความจำเพียง 1 ส่วน ส่วนข้อมูลชนิดสตริงตัวอักษร 1 ตัว ต้องการหน่วยความจำ 2 ส่วน ส่วนแรกใช้เก็บข้อมูล และส่วนที่สองใช้เก็บจะสิ้นสุดของสตริง

รูปที่ 3 แสดงความแตกต่างของการเก็บข้อมูลระหว่างสตริงกับตัวอักษร
ซึ่งสตริงที่แท้จริง เรียกอีกอย่างว่าค่าคงที่แบบสตริง คือ ตัวอักษรที่วางเรียงกันไป และอยู่ภายในเครื่องหมาย “ “ ซึ่งดังที่ได้แสดงในตัวอย่างถัดไป
“C is a high-level language.”
“Hello”
“abcd”

การประกาศตัวแปรสตริงและการกำหนดค่าเริ่มต้น
ความจริงภาษา C จะไม่มีชนิดข้อมูลสตริง แต่มันจะใช้อาร์เรย์ของตัวอักษรแทน ในการประกาศตัวแปรสตริงนั้น จะคำนึงความยาวของข้อมูล และสิ่งที่ลืมไม่ได้ คือ จะต้องมีพื้นที่อีก 1 ในการใช้เก็บจุดสิ้นสุดของสตริงด้วย เพราะภาษา C จะมีข้อบังคับอยู่ว่า ไบต์สุดท้ายจะเป็นส่วนที่เก็บจุดสิ้นสุดของสตริงเสมอ เช่น ผู้ใช้มีข้อมูลขนาด 10 ไบต์หรือ 10 ตัวอักษร ผู้ใช้จะต้องกำหนดขนาดของตัวแปรสตริงตัวนั้นเป็น 11 ไบต์
char str[11]
แต่ผู้ใช้ก็สามารถประกาศตัวแปรสตริงได้โดยไม่ต้องบอกขนาดของความยาว แต่ผู้ใช้จะต้องกำหนดค่าเริ่มต้นให้กับตัวแปรสตริงตัวนั้นเลย ดังตัวอย่างด้านล่าง และการเก็บข้อมูลในหน่วยความจำแสดงในรูปที่ 4

        Char month[ ] = “January”
ในการกำหนดค่าเริ่มต้นนั้น ไม่จำเป็นต้องกำหนดข้อมูลให้เต็มพอดีกับขนาดที่กำหนดไว้ก็ได้ ส่วนพื้นที่ที่เหลือก็จะเป็นค่าที่ไม่สามารถทราบได้ ดังตัวอย่างด้านล่าง และการเก็บข้อมูลในหน่วยความจำแสดงในรูปที่ 4
Char str[11] = “Good  Day”

รูปที่ 4 แสดงการเก็บข้อมูลในหน่วยความจำ

สตริงกับพอยเตอร์
ถ้าผู้ใช้ต้องการที่จะประกาศตัวแปรพอยเตอร์ของสตริง ก็สามารถทำได้เหมือนกับการประกาศพอยเตอร์ตามปกติ แต่จะสามารุใช้ได้กับชนิดข้อมูลที่เป็นตัวอักษรหรือ Char เท่านั้นในการประกาศพอยเตอร์และกำหนดค่าเริ่มต้น สามรถทำได้ดังตัวอย่างด้านล่างนี้
Char *pStr = “Good Day!”;
ลักษณะของตัวแปรพอยเตอร์ของสตริงนี้ เมื่อประกาศแล้วพอยเตอร์จะชั้นไปยังข้อมูลตัวแรกของสตริง ดังที่แสดงในรูปที่ 5

รูปที่ 5 แสดงลักษณะของตัวแปรพอยเตอร์

จากที่ได้ศึกษากันไปแล้ว่า ในการเก็บข้อมูลของสตริงนั้นจะเก็บเรียงกันไป แล้วมีพอยเตอร์หนึ่งตัวที่ชี้ไปยังข้อมูลตัวแรก  ถ้าต้องการที่จะเข้าถึงข้อมูลของสตริงในแต่ละตัวก็สามารถทำได้ โดยการเพิ่มค่าของพอยเตอร์ไปที่ละหนึ่งดังที่แสดงในรูปที่ 6

รูปที่ 6 แสดงการเข้าข้อมูลของพอยเตอร์ของสตริง

ฟังก์ชัน Input / Output ของสตริง
ฟังก์ชัน Input
ฟังก์ชันในการ Input ข้อมูลลงสู่สตริงก็คือ ฟังก์ชัน  scanf( ) นั่นเอง แต่จะใช้รูปแบบข้อมูลเป็น  %s ( ซึ่งจะใช้ทั้งการ Input และ Output ) สมมุตว่ามีตัวแปรสตริงชื่อ month และต้องการจะรับค่าเข้าสู่ตัวแปร month โดยหน้าตัวแปรไม่ต้องใช้เครื่อง  Address จะต้องการรับข้อมูลเข้าก็สามารถทำได้ดังนี้
scanf(“%s”,month);
ในตัวอย่างด้านบนอาจจะมีข้อผิดพลาด เพราะจะใส่ข้อมูลเกินกว่าขนาดความยาวของสตริงที่ประกาศไว้ สมมุติว่ามีตัวแปรสตริง month อยู่ 1 ตัวโดยถูกประกาศไว้ดังตัวอย่างด้านล่างนี้
char month[10];
คงจำข้อบังคับของการใช้สตริงได้ จะสามารถใช้ความยาวของสตริงได้เท่ากับความยาวของสตริง – 1 เพราะไบต์สุดท้ายใช้เก็บจุดสิ้นสุดของสตริง เพราะฉะนั้นในการรับค่าจะต้องทำการกำหนดให้รับข้อมูลจริง ๆ กี่ตัว โดยทำดังตัวอย่างด้านล่าง
                scanf(“%9s”,month);
จากคำสั่งหน้าที่ผ่านมา ไม่ว่าผู้ใช้จะพิมพ์ข้อมูลยาวเพียงใด ข้อมูลที่จะเก็บเข้าสู่สตริง month จะมีเพียง 9 ตัวเท่านั้น

ฟังก์ชัน Output
ฟังก์ชันในการ printf  ซึ่งในภาษา C นั้น สามารถที่จะกำหนดให้ข้อมูลของสตริง เมื่อเวลาจะพิมพ์แสดงนั้น จะให้อยู่ติดขอบซ้ายหรือขอบขวาก็ได้ โดยใช้เครื่องหมาย - และต้องกำหนดขนาดความยาวของส่วนที่จะพิมพ์ด้วย ดังตัวอย่างต่อไปนี้
printf(“| %30s| \n”,”This is the string”);
printf(“|%-30s| \n”,”This is the string”);
ผลลัพธ์ของสองคำสั่งในตัวอย่างด้านบนจะได้ดังนี้
|              This is the string |
| This is the string              |
และยังสามารถทำไห้แสดงข้อมูลออกมายาวสั้นได้ตามต้องการ
printf(“| %-15.14s |”,”12345678901234567890”);
ผลลัพธ์ก็จะได้ดังนี้ 
12345678901234 |

 

 

โปรแกรมที่ 10-1 แสดงการ Input และ Output ข้อมูล

 

 

 

ฟังก์ชันอื่นที่ใช้กับสตริง
การใช้สตริงนั้น จะมีฟังก์ชันในการกระทำกับสตริงอีกมาก จะช่วยให้การทำงานนั้นสะดวดมากยิ่งขึ้น ซึ่งการใช้ฟังก์ชันต่าง ๆ ที่เกี่ยวกับสตริงนั้นจะต้องนำเข้าไลบรารีไฟล์ strintg.h ด้วยเสมอ ซึ่งมีฟังก์ชันต่าง ๆ ดังนี้
ความยาวสตริง (strlen)
ฟังก์ชัน strlen เป็นฟังก์ชันที่ส่งค่ากลับเป็นจำนวนความยาวของสตริงที่ส่งไปให้ โดยจะรวมจุดสิ้นสุดของสตริงหรือ Null Charater ด้วย ถ้าเป็นสตริงว่างจะส่งค่ากลับเป็น 0 ซึ่งการประกาศฟังก์ชัน strlen เป็นต้น
int strlen (const char *string);
ตัวอย่างด้านล่างนี้เป็นการใช้ฟังก์ชัน strlen
x = strlen(“Sorapong”);
หรือ
char str[] = “Good Morning”;
x = strlen(str);

 

โปรแกรมที่ 10-2 แสดงการใช้ฟังก์ชัน strlen

 

คัดลอกสตริง ( strcpy, strncpy )
ในภาษา  C จะมีฟังก์ชันในการคะดลอกสตริงหนึ่งไปใส่ในอีกสตริงหนึ่ง อยู่ 2 ฟังก์ชัน คือ  strcpy และ  strncpy ทั้ง 2 ฟังก์ชันนี้  จะเป็นฟังก์ชันในการคัดลอกสตริง แต่ในฟังก์ชันที่ 2 สามารถกำหนดความยาวของสตริงที่ต้องการจะคัดลอกได้
strcpy ฟังก์ชัน  strcpy เป็นฟังก์ชันในการคัดลอกสตริงพื้นฐาน การทำงาน คือ จะทำการคัดลอกสตริงต้นทั้งหมด ซึ่งจะรวมไปถึง Null Character ด้วย ไปใส่ในสตริงปลายทาง โดยการประกาศฟังก์ชัน strcpy เป็นดังนี้
char*strcpy (char *to_string, const char *from_string);
ตัวอย่างด้านล่างนี้เป็นตัวอย่างการใช้ฟังก์ชัน  strcpy 
strcpy(s1,s2);
ซึ่งในรูปที่ 7 จะแสดง 2 ตัวอย่างในการคัดลอกสตริง สตริงต่าง ๆ ด้วย โดยใช้ฟังก์ชัน strcpy
 

                                รูปที่ 7 แสดงการเข้าข้อมูลของพอยเตอร์ของสตริง
ในรูปที่ 7 ในตัวอย่างแรกนั้นแสดงการคัดลอกสตรองที่ปกติ แต่ในตัวอย่างที่ 2 นั้น จะเห็นถึงปัญหาการทำของฟังก์ชัน strcpy คือถ้าสตริง  s1 มีขนาดยาวกว่าสตริง s2 โดยถ้ามีสตริง s3 มาเก็บต่ออยู่ที่ด้านหลังของสตริง s2 เมื่อทำชุดคำสั่งนี้แล้วฟังก์ชันก็จะทำงานปกติ คือ จะคัดลอกสตริง s1 ทั้งหมด มาใส่ในสตรอง s2 แต่สตริง s1 มีความยาวเกินสตริง s2 ผลก็คือ สตริงที่คัดลอกมาจาก s1 ก็ไปทับกับสตริง s3 บางส่วนด้วย
strncpy ฟังก์ชัน strncpy เป็นฟังก์ชันในการคัดลอกสตริงที่จะสามารถแก้ไขปัญหาของฟังก์ชัน strcpy ได้ เนื่องจากฟังก์ชันนี้ ผู้ใช้สามารถกำหนดความยาวในการคัดลอกได้ การประกาศฟังก์ชัน strncpy เป็นดังนี้
char *strncpy(char *to_string,const char *from_string,int size);
ตัวอย่างด้านล่างนี้ เป็นตัวอย่างการใช้ฟังก์ชัน strcpy
strncpy(s1,s2,sizeof(s1));
ในรูปที่ 8 จะแสดง 2 ตัวอย่างในการคัดลอกสตริง และผลของใช้ฟังก์ชัน strncpy
 
รูปที่ 8 แสดงการเข้าข้อมูลของพอยเตอร์ของสตริง
โดยสามารถหาขนาดของสตริงได้โดยใช้คำสั่ง sizeof จากรูปที่ 8 แสดงให้เห็นว่าฟังก์ชัน strncpy นั้นจะป้องกันปัญหาการคัดลอกสตริงปใส่เกินความยาวของสตริงปลายทาง
เปรียบเทียบสตริง (strcmp,strncmp)
ฟังก์ชันในการเปรียบเทียบสตริงในภาษา c จะมีอยู่ 2 ฟังก์ชัน คือ ฟังก์ชัน strcmp และฟังก์ชัน strncmp ซึ่งฟังก์ชันทั้งสองจะทำการเปรียบเทียบเหมือนกัน แต่ฟังก์ชัน strncmp จะกำหนดความยาวในการเปรียบเทียบได้ ซึ่งผลของฟังก์ชันที่จะส่งกลับมาให้จะมีดังนี้
1. ถ้าทั้ง 2 สตริงเท่ากันจะส่งค่ากลับมาเป็น 0 โดยที่สตริงจะเท่ากัน ได้จะต้องมีความยาวที่เท่ากัน แบะมีตัวอักษรเหมือนกันทุกตัว ดังแสดงในรูปที่ 9
2. ถ้าสตริงตัวแรกน้อยกว่าสตรองตัวที่สอง จะส่งค่ากลับเป็นค่าที่น้อยกว่า 0 โดยสตริง s1 จะน้อยกว่า s2 ก็เมื่อทำการเปรียบเทียบไปที่ละตัวอักษร แล้วพบว่าตัวอักษรใน s1 มีค่าน้อยกว่าตัวอักษรของ s2 (โดยเทียบจากรหัส ACSII) หรือจุดสิ้นสุดของ s1 อยู่ก่อน  s2 ดังแสดงในรูปที่ 10
3. ถ้าสตริงตัวแรกมากกว่าสตริงตัวที่สอง จะส่งค่ากลับเป็นค่าที่มากกว่า 0 สตริง s1 จะน้อยกว่า s2 ก็เมื่อทำการเปรียบเทียบไปที่ละตัวอักษรแล้วพบว่าตัวอักษรใน s1 มีค่ามากกว่าตัวอักษรของ s2 (โดยเทียบจากรหัส ACSII) หรือถ้าจุดสิ้นสุดของ s1 อยู่หลัง s2 ดังแสดงในรูปที่ 11

รูปที่ 9 แสดงการเปรียบเทียบสตริงที่ผลเป็นเท่ากัน

รูปที่ 10 แสดงการเปรียบเทียบสตริงที่ผลเป็นน้อยกว่า
 
รูปที่ 11 แสดงการเปรียบเทียบสตริงที่ผลเป็นมากกว่า


Strcmp ฟังก์ชัน strcmp การประกาศฟังก์ชันดังนี้
char *strcmp(const char *string1, const char *string2);
ตัวอย่างด้านล่างนี้ เป็นตัวอย่างการใช้ฟังชัน strcmp
if (strcmp(str1,str2) = = 0)
/*ชุดคำสั่งเมื่อเท่ากัน*/
else
/*ชุดคำสั่ง เมื่อไม่เท่ากัน*/
Strncmp ฟังก์ชัน strncmp จะกำหนดความยาวในการเปรียบเทียบได้ การประกาศฟังก์ชันดังนี้
char *strncmp (const char *string1,const char *string2,int size);
ในตารางแสดงผลของการเปรียบเทียบระหว่างสตริง 2 สตริง โดยใช้ฟังก์ชัน strncmp
ตารางแสดงผลของฟังก์ชัน strncmp


สตริง 1

สตริง2

ขนาด

ผล

ค่าที่ส่งกลับ

   “ABC123”

   “ABC123”

8

เท่ากับ

0

   “ABC123”

   “ABC456”

3

เท่ากับ

0

   “ABC123”

   “ABC456”

4

สตริง1 < สตริง2

<0

   “ABC123”

   “ABC”

3

เท่ากับ

0

   “ABC123”

   “ABC”

4

สตริง1 > สตริง2

>0

   “ABC”

   “ABC123”

3

เท่ากับ

0

   “ABC123”

   “ABC123”

-1

เท่ากับ

0

ต่อสตริง (strcat, strncat)
ฟังก์ชันที่ใช้ในการต่อสตริง มีฟังก์ชัน strcat และฟังก์ชัน strncat ซึ่งการทำงานของฟังก์ชันทั้งคือ จับสตริงชุดหนึ่งไปต่อท้ายกับสตริงอีกชุดหนึ่ง
strcat การประกาศฟังก์ชัน strcat เป็นดังนี้
char *strcat (const char *string1,const char *string2);
strncat การประกาศฟังก์ชัน strncat เป็นดังนี้
char *strncat (const sschar*string1,const char *string2,int size);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

บทที่10