|
String Constant
ใน entry นี้จะพูดถึงเรื่องที่ C programmer รู้จักกันดีอีกเรื่องหนึ่ง คือ string constant ครับ
string constant ก็คือการนำเอา character constant มาเรียงต่อๆกัน โดยมีเครื่องหมาย double quote " ปิดหัวปิดท้าย
จำนวน character ที่มาเรียงกันจะมีกี่ตัวก็ได้ ถ้าไม่มีเลยสักตัวจะเรียกว่า empty string แต่ไม่ว่าจะมีกี่ตัว compiler จะเติม null character '\0' ปิดท้ายให้เสมอ
ประเภทของ string constant ก็จะเหมือนกับ character constant คือมีสองแบบ แบบ char ธรรมดา กับแบบ wide character (wchar_t) แต่ที่จะพูดถึงใน entry นี้ จะเป็นแบบ char ธรรมดาครับ
ตัวอย่างของ string constant คือ "This is the String" "" /* empty string */
เนื่องจาก string constant คือการนำเอา character constant มาเรียงต่อๆกัน ดังนั้นเราสามารถใส่ escape code แบบเดียวกับ character constant ตามรูป

เราสามารถเอา string constant หลายอันมาต่อกันเป็น string constant อันเดียว compiler จะเติม null character ปิดท้ายหลังจากรวมกันแล้วเท่านั้น ตัวอย่างต่อไปนี้จะให้ผลลัพธ์แบบเดียวกัน
ตัวอย่างที่ 1 printf("This " "is " "my " "string\n");
ตัวอย่างที่ 2 printf("This is my \ string\n");
ตัวอย่างที่ 3 printf("This is my string\n");
การต่อ string ด้วยเครื่องหมาย \ ในตัวอย่างที่ 2 หลังเครื่องหมาย \ ต้องขึ้นบรรทัดใหม่ทันที ห้ามมีตัวอักษรใดๆ
การต่อ string ไม่ได้มีจุดมุ่งหมายแค่เอา string constant หลายอันมาต่อกันเท่านั้น บางครั้งเป็นการป้องกัน compiler เข้าใจผิด ลองมาดูตัวอย่าง
สมมุติว่าเราต้องการสร้าง string constant ที่มี character สองตัว character ตัวแรกคือ '\01' (เลขฐานแปดค่า 1) ส่วนตัวที่สองคือ '2' (ASCII character เลขสอง)
ถ้าสร้าง string constant โดยนำ character ทั้งสองมาเรียงกันเฉยๆ จะได้ "\012" compiler จะตีความว่า string constant นี้มี character ตัวเดียวคือ '\012' เป็น octal number เลขฐานแปด ซึ่งไม่ได้เป็นไปตามที่เราต้องการ
กรณีเราอาจจะทำเป็นสอง string มาต่อกัน แบบนี้ "\01" "2" compiler จะตีความเป็น string constant ที่มีสอง character อย่างที่เราต้องการ
ขนาดของ string constant จะเท่ากับขนาดของจำนวน character constant ที่มีอยู่ บวกกับ null character ที่ compiler เติมปิดท้ายให้ ส่วนความยาวของ string ได้จากการนับจำนวน character จนถึง null character ไม่รวม null นะครับ ขนาดของ string constant หาได้จาก sizeof ส่วนความยาวของ string ได้จากการเรียกใช้ function strlen ใน standard C library
string | | sizeof | value | | strlen | value | "" | | sizeof "" | 1 | | strlen("") | 0 | "xyz" | | sizeof "xyz" | 4 | | strlen("xyz") | 3 | "xyz\0" | | sizeof "xyz\0" | 5 | | strlen("xyz\0") | 3 | "xyz\0" จะมี null character ปิดท้ายสองตัว ตัวแรกมาจากการกำหนด \0 ส่วนตัวที่สอง compiler เติมให้
string constant ที่เหมือนกัน ไม่จำเป็นต้องอยู่ใน memory ที่เดียวกัน ถือว่าเป็น implementation defined ครับ โปรแกรมด้านล่างถ้าไป compile และรันด้วย compiler ต่างกันก็อาจได้ผลไม่เหมือนกัน #include <stdio.h> int main() { char *s1 = "abcxyz"; char *s2 = "abcxyz"; if (s1 == s2) printf("s1 and s2 point to the same string\n"); else printf("s1 and s2 point to the different string\n"); return 0; }
เรื่องสุดท้ายคือ การแก้ไขค่าใน string constant จะถือเป็น undefined behavior ครับ
compiler อาจจะจัดให้ string constant อยู่ใน memory ส่วนที่เป็น read-only หรือ memory ส่วนที่มีระบบป้องกันการแก้ไขค่าในขณะที่รันโปรแกรม การไปแก้ไขค่าใน string constant เลยอาจทำให้โปรแกรมทำงานผิด หรือตายได้
อย่างไรก็ตาม ความสามารถในการป้องกัน memory แบบนี้ ขึ้นกับ OS หรือ platform หาก OS หรือ platform ไม่มีระบบป้องกัน การไปแก้ไขค่าใน string constant ก็จะทำได้ มันเลยไม่แน่นอน เป็น undefined behavior
สรุปว่าไม่ควรแก้ไขค่าใน string constant ครับ ชื่อมันก็บอกอยู่แล้วว่าเป็น constant แล้วยังจะไปแก้ค่ามันอีก

Create Date : 13 กันยายน 2551 |
Last Update : 14 กันยายน 2551 9:01:13 น. |
|
0 comments
|
Counter : 1558 Pageviews. |
 |
|
|
| |
|
|