เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Group Blog
 
All blogs
 
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 : 1329 Pageviews.

ชื่อ :
Comment :
  *ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก
 

zkaru
Location :
กรุงเทพฯ Thailand

[Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 2 คน [?]




เรื่องที่อยากเขียน ... เรื่องที่พยายามเขียน ...
Friends' blogs
[Add zkaru's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.