วันอังคารที่ 9 พฤษภาคม พ.ศ. 2560

เปรียบเทียบสตริงใน C

ยอมรับสารภาพเลยว่าเลิกเขียนโปรแกรมภาษา C ในอดีตเมื่อหลายปีก่อนก็เพราะการเปรียบเทียบสตริงนี่แหละ ทำไม่ได้หาในหนังสือไม่มีวิธีแก้ไข สมัยนั้นยังไม่มี google และหนังสือก็มีน้อย เงินซื้อหนังสือก็น้อยด้วย





ตัวอย่างเช่น

char a = "Hello";
char b = "Hello";

เมื่อใช้คำสั่ง if (a == b) printf("%s", a); บรรทัดนี้ไม่มีการพิมพ์ค่า ตัวแปร a ออกทางหน้าจออย่างแน่นอน และทำให้ท้อแล้วเลิกเขียนภาษา C เลยเชียว เพราะภาษาอื่นเขาทำได้

แต่สำหรับใครที่ใช้ C++ ก็ง่ายเลย ตัวแปรสตริงเปรียบเทียบกันตรงๆ ได้ เช่น

string a = "Hello";
string b = "Hello";

if (a == b) std::cout << a << std::endl;

คำสั่งนี้แสดงค่าตัวแปร a ออกทางหน้าจออย่างแน่นอน แล้วทำไมภาษา C ถึงทำไม่ได้ล่ะ

ง่ายๆ คือ ถ้าเราเอาตัวแปร char [] มาเปรียบเทียบกัน จะเป็นการเปรียบเทียบ address หรือตำแหน่งเก็บของตัวแปร ดังนั้นจึงไม่มีทางที่จะเท่ากันได้ ผลลัพธ์จึงเป็น false เสมอ

วิธีการเปรียบเทียบทำได้สองอย่าง สำหรับภาษา C

1. ใช้ฟังค์ชัน strcmp()

ในภาษา C มีฟังค์ชันสำหรับเปรียบเทียบสตริงให้เรียบร้อยใช้งานง่ายๆ ไม่ยุ่งยาก เช่น

char a[] = "Hello";
char b[] = "Hello";

if (strcmp(a, b) == 0){
   //ถ้าเปรียบเทียบแล้วได้เท่ากับ 0 แสดงว่าข้อความนั้นเหมือนกันทุกประการ
}

2. เขียนโปรแกรมตรวจสอบเอง

วิธีการนี้ทำให้ทราบถึงหลักการเท่านั้น เวลาใช้งานจริงไม่ต้องเขียนเองใช้คำสั่ง strcmp() แทนเลย

char a[] = "Hello";
char b[] = "Hello";

int i = 0;                                                //เริ่มตรวจสอบสมาชิกอะเรย์ที่ 0 ไปเรื่อยๆ 
while (1){
    if (c[i] != d[i]){                                //ถ้ามีสมาชิกที่ i ไม่ตรงกันก็ให้สิ้นสุดตรวจสอบ (ไม่เท่ากัน)
        printf("Not equal");
        break;
    }
    if (c[i] == '\0' && d[i] == '\0'){      //ถ้าสมาชิกที่ i ของ c และ d เป็น \0 ถือว่าตรงกัน
        printf("Equal");
        break;
    }
    i++;
}

และที่สำคัญอีกประการหนึ่ง a[] = "Hello" กับ *b = "Hello" ก็เป็นตัวแปรต่างชนิดกัน a เป็น Array และ b เป็น Pointer ด้งนั้นควรระวังและละเอียดอ่อนกับการเขียนโปรแกรมสักนิดก็จะไม่เจอปัญหาชวนปวดหัวนะครับ ...

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...