การเขียนโปรแกรมภาษาซี/สตริง

จาก วิกิตำรา
ข้ามไปยัง: บอกทาง, ค้นหา

string (**สตริง** **สายอักขระ** **ข้อความ**) เป็น [[[ADT]]] และ [[[datatype]]] ชนิดหนึ่งสำหรับเก็บข้อความ สำหรับทั้งภาษา C และ C++ นั้น [[[constant|ค่าคงที่]]] string ([[[const]]] string) จะเขียนอยู่ในคู่ของอัญประกาศ ("...") เช่น "hello world"

+ ภาษา C ภาษา C **ไม่มี** datatype ชื่อ string จริงๆ มีแต่รูปแบบ string ซึ่งเป็น [[[array]]] ของ [[[char]]] และมีการจัดเก็บข้อมูลพิเศษกว่า array ของ char ธรรมดาเล็กน้อย

++ การเก็บข้อมูล array ของ char จะประกอบไปด้วยอักขระต่างๆ อักขระในช่องที่ $ i $ ใน array แทนด้วยอักขระตัวที่ $ i $ ของ string

    • หลังจากอักขระช่องสุดท้ายจะมี [[[null character]]] ('\0', 0) ปิดท้าย**

ดังนั้น **string ความยาว $ n $ ก็ต้องประกาศ array อย่างน้อย $ n + 1 $ ช่อง**

อาจกล่าวได้ว่า string = array of char + '\0'

++ const string const string "abcxyz" จะเทียบเท่ากับ const [[[array]]] {'a', 'b', 'c', 'x', 'y', 'z', '\0'}

++ การประกาศตัวแปร สมมุติจะสร้าง string ซึ่งเก็บข้อมูล "abcx" โดยประกาศ array 10 ช่อง code char str[10]; str[0] = 'a'; str[1] = 'b'; str[2] = 'c'; str[3] = 'x'; str[4] = '\0'; /code

ในกรณีที่ประกาศตัวแปร สามารถใช้ [[[initializer]]] คล้ายๆ array ได้ (อ่านเพิ่มเติมที่ [[[array#initializer]]]) code char str[10] = {'a', 'b', 'c', 'x', '\0'}; /code หรือ code char str[10] = "abcx"; /code

คล้ายๆกับ array ซึ่งอาจจะไม่ระบุจำนวนช่องก็ได้ จำนวนช่องของ array จะเป็น $ n + 1 $ ตามจำนวนการใช้ช่อง code char str[] = "abcx"; /code

เนื่องจาก array และ [[[pointer]]] คล้ายๆกัน (แทบจะเป็นสิ่งเดียวกัน) จากโค้ดที่แล้วจึงอาจเขียนได้ว่า code char* str = "abcx"; /code พึงระวังว่าความหมายของคำสั่งนี้ หมายความว่าให้ address ของ array/string "abcx" มาใส่ใน pointer str ซึ่ง "abcx" เป็นค่าคงที่ ถูกเก็บใน[[[หน่วยความจำส่วน code]]] ซึ่งหน่วยความจำส่วนนี้**แก้ค่าไม่ได้** หากสั่ง code str[0] = 'z'; /code โปรแกรมจะ [[[crash]]] ทันที

แต่ const string = const array = const char* ดังนั้นจึงสามารถ assign เมื่อไหร่ก็ได้ แตกต่างจาก array ที่ทำได้ตอน initialize เท่านั้น code char *str; str = "abcx"; /code

จากโค้ดตัวอย่างทั้ง 2 อันที่แล้ว สำหรับภาษา C++ ซึ่งเคร่งครัดเรื่อง datatype มากกว่า C จะไม่สามารถทำได้ เพราะ "abcx" เป็น const string = const char* ดังนั้น str ก็ควรเป็น const char* ด้วย จึงสามารถ assign ค่าได้เฉพาะตอน initialize เท่านั้น นอกจากนี้ datatype ก็ควรจะเป็น const char* แทนที่ char* ด้วย code const char *str = "abcx"; /code

หากอยาก assign ค่าเมื่อไหร่ก็ได้ อาจใช้ [[[datatype conversion]]] เข้ามาช่วย โดยการประกาศเป็น char* เหมือนเดิม แต่การ assign ค่าต้องมีการทำ [[[datatype conversion]]] ด้วย code char *str; str = (char*)"abcx"; /code

+ ฟังก์ชั่นใน string.h อ่านเพิ่มที่ string.h

+ ภาษา C++ อาจใช้ array ของ char เหมือนภาษา C หรือใช้ std::string ก็ได้