การเปรียบเทียบสตริง: การเขียนโปรแกรม C

String Comparison C Programming



สตริงในภาษา C คืออาร์เรย์ของอักขระ ซึ่งสิ้นสุดด้วยอักขระ null () การใช้สตริงคุณสมบัตินี้จะถูกเปรียบเทียบ







สองสตริงสามารถเปรียบเทียบได้หลายวิธี ในบทช่วยสอนนี้ ขั้นแรก เราจะเห็นฟังก์ชันที่ผู้ใช้กำหนดเองเพื่อเปรียบเทียบสองสตริง จากนั้นเราจะเห็นฟังก์ชันไลบรารีในตัวที่สามารถใช้เพื่อเปรียบเทียบสองสตริงได้อย่างง่ายดาย มาเริ่มกันเลยดีกว่า



การเปรียบเทียบสตริงโดยใช้ฟังก์ชันที่ผู้ใช้กำหนด :

เราจะเขียนฟังก์ชัน stringCompare() เพื่อเปรียบเทียบสตริง เราสำรวจสตริงและเปรียบเทียบอักขระแต่ละตัวของสตริงจนกว่าจะถึงจุดสิ้นสุดของตัวใดตัวหนึ่งหรือทั้งสองตัวหรือตัวใดตัวหนึ่งที่ไม่ตรงกัน หากการข้ามผ่านมาถึงจุดสิ้นสุดของสตริงทั้งสอง สตริงนั้นจะถูกจับคู่ มิฉะนั้น สตริงจะไม่ตรงกัน



01./*userDefinedFunction.c*/
02.
03.#รวม
04.
05.intstringCompare( charstr1[ ], charstr2[ ] )
06.{
07.intผม=0;
08.
09. ในขณะที่(str1[ผม] ==str2[ผม] )
10.
สิบห้า.
16.ถ้า(str1[ผม] == ' 0' &&str2[ผม] == ' 0' )
17.กลับ 0;
18.อื่น
19.กลับ -1;
ยี่สิบ.
ยี่สิบเอ็ด.}
22.
2. 3.
24.intหลัก()
25.{
26.charstr1[30],str2[30];
27.
28. printf ('ป้อนสตริงแรก:');
29. scanf ('% [^NS]% * ค ',str1);
30. printf ('ป้อนสตริงที่สอง:');
31. scanf ('% [^NS]% * ค ',str2);
32.
33.ถ้า(stringCompare(str1,str2) == 0)
3. 4. printf ('สตริงเท่ากันNS');
35.อื่น
36. printf ('สตริงไม่เท่ากันNS');
37.
38.กลับ 0; 39.}





ที่นี่เราสำรวจสตริงโดยใช้ while loop และ variable ผม . เมื่ออักขระเท่ากันในตำแหน่งเดียวกันของทั้งสองสตริง ค่าของ ผม เพิ่มขึ้น 1 (บรรทัดที่ 13) หากอักขระไม่เท่ากัน (บรรทัดที่ 09) หรือเราถึงจุดสิ้นสุดของสตริง (บรรทัดที่ 11) แสดงว่าการวนรอบ while เป็นการพัก หลังจากวนรอบ while เราตรวจสอบทั้ง string traversals ว่าถึงจุดสิ้นสุดหรือไม่ (บรรทัดที่ 16) หากการข้ามผ่านมาถึงจุดสิ้นสุดของสตริงทั้งสอง สตริงจะเท่ากัน มิฉะนั้นจะไม่เท่ากัน

การเปรียบเทียบสตริงโดยใช้ฟังก์ชันไลบรารีในตัว:

ฟังก์ชันไลบรารีต่อไปนี้สามารถใช้สำหรับการเปรียบเทียบสตริงได้ ฟังก์ชันทั้งหมดมีการประกาศใน string.h ไฟล์ส่วนหัว



ฟังก์ชัน strcmp() :

ฟังก์ชันนี้เปรียบเทียบสองสตริงที่ส่งผ่านไปยังฟังก์ชัน

ไวยากรณ์ :

int strcmp (const char *str1, const char *str2)

ส่งกลับมูลค่า: คืนค่า 0 หากสตริงมีค่าเท่ากัน ส่งคืนค่าจำนวนเต็มลบถ้าค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรกน้อยกว่าสตริงที่สอง ส่งคืนค่าจำนวนเต็มบวกถ้าค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรกมากกว่าสตริงที่สอง บางระบบคืนค่าความแตกต่างของค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกัน และระบบบางระบบคืนค่า -1 ถ้าค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรกน้อยกว่าสตริงที่สอง และส่งคืนค่า 1 หากค่า ASCII ของอักขระที่ไม่ตรงกันตัวแรกของ สตริงแรกมีค่ามากกว่าสตริงที่สอง

ตัวอย่าง คืนมูลค่า คำอธิบาย
strcmp( สวัสดีชาวโลก สวัสดีชาวโลก ) 0 สองสายเหมือนกัน
strcmp( สวัสดี สวัสดี โลก ) 0 สตริงจะถูกเปรียบเทียบจนถึงอักขระ '' สตริงแรกโดยค่าเริ่มต้นจะลงท้ายด้วย '' และสตริงที่สองมีอักขระ '' หลัง 'Hello'
strcmp( สวัสดี″,สวัสดี โลก ) 0 สตริงจะถูกเปรียบเทียบจนถึงอักขระ ''
strcmp( สวัสดีชาวโลก สวัสดีชาวโลก ) จำนวนเต็มลบ ค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรก ('H') น้อยกว่าสตริงที่สอง ('h')
strcmp( สวัสดีชาวโลก สวัสดีชาวโลก ) จำนวนเต็มบวก ค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรก ('h') มากกว่าสตริงที่สอง ('H')

ฟังก์ชัน strncmp() :

ฟังก์ชันนี้คล้ายกับฟังก์ชัน strcmp() แต่ในที่นี้ เราต้องระบุจำนวนไบต์ที่เปรียบเทียบโดยส่งอาร์กิวเมนต์พิเศษไปยังฟังก์ชัน

ไวยากรณ์:

int strncmp (const char *str1, const char *str2, size_tNS)

ส่งกลับมูลค่า: ฟังก์ชันส่งคืน 0 ถ้าครั้งแรก NS อักขระของทั้งสองสตริงมีค่าเท่ากัน มิฉะนั้นจะส่งกลับจำนวนเต็มลบหรือบวกขึ้นอยู่กับเครื่องหมายของความแตกต่างระหว่างค่า ASCII ของอักขระที่ไม่ตรงกันตัวแรก

ตัวอย่าง คืนมูลค่า คำอธิบาย
strncmp( สวัสดีชาวโลก สวัสดีชาวโลก5 ) 0 5 ตัวอักษรแรกเหมือนกัน
strncmp( สวัสดี สวัสดี โลก,5 ) 0 5 ตัวอักษรแรกเหมือนกัน
strncmp( สวัสดี″,สวัสดี โลก,8 ) 0 '' อยู่หลังอักขระ 5 ตัวแรกในทั้งสองสตริง ดังนั้น การเปรียบเทียบจะหยุดหลังจาก 5 ไม่ใช่ 8
strncmp( สวัสดีชาวโลก สวัสดีชาวโลก5 ) จำนวนเต็มลบ ค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรก ('H') น้อยกว่าสตริงที่สอง ('h')

ฟังก์ชัน strcasecmp() :

ฟังก์ชันนี้คล้ายกับฟังก์ชัน strcmp() แต่ที่นี่สตริงไม่คำนึงถึงขนาดตัวพิมพ์

ไวยากรณ์:

intstrcasecmp(const char *str1, const char *str2)

ส่งกลับมูลค่า: เหมือนกับ strcmp() แต่สตริงจะถือว่าเป็น ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ .

ตัวอย่าง คืนมูลค่า คำอธิบาย
strcasecmp( สวัสดีชาวโลก สวัสดีชาวโลก ) 0 สองสายเหมือนกัน
strcasecmp( สวัสดี สวัสดี โลก ) 0 สตริงจะถูกเปรียบเทียบจนถึงอักขระ '' สตริงแรกโดยค่าเริ่มต้นจะลงท้ายด้วย '' และสตริงที่สองมีอักขระ '' หลัง 'Hello'
strcasecmp( สวัสดีชาวโลก สวัสดีชาวโลก ) 0 Strings are คำนึงถึงขนาดตัวพิมพ์ ดังนั้น Hello World และ Hello World ก็เหมือนกัน

ฟังก์ชัน strncasecmp() :

ฟังก์ชันนี้คล้ายกับฟังก์ชัน strncmp() แต่ที่นี่สตริงไม่คำนึงถึงขนาดตัวพิมพ์

ไวยากรณ์:

intstrncasecmp(const char *str1, const char *str2)

ส่งกลับมูลค่า: เหมือนกับ strncmp() เมื่อสตริงถือว่าตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

ตัวอย่าง คืนมูลค่า คำอธิบาย
strncasecmp( สวัสดีชาวโลก สวัสดีชาวโลก5 ) 0 5 ตัวอักษรแรกเหมือนกัน
strncasecmp( สวัสดี สวัสดี โลก,5 ) 0 5 ตัวอักษรแรกเหมือนกัน
strncasecmp( สวัสดี″,สวัสดี โลก,8 ) 0 '' อยู่หลังอักขระ 5 ตัวแรกในทั้งสองสตริง ดังนั้น การเปรียบเทียบจะหยุดหลังจาก 5 ไม่ใช่ 8
strncasecmp( สวัสดีชาวโลก สวัสดีชาวโลก5 ) 0 Strings are คำนึงถึงขนาดตัวพิมพ์ ดังนั้นสวัสดีและสวัสดีก็เหมือนกัน

ฟังก์ชั่น memcmp() :

ฟังก์ชันนี้เปรียบเทียบสองบล็อกหน่วยความจำแบบไบต์ต่อไบต์ เราต้องผ่านตัวชี้สองตัวของบล็อกหน่วยความจำและจำนวนไบต์เพื่อเปรียบเทียบ

ไวยากรณ์:

int memcmp (const โมฆะ *str1, const โมฆะ *str2, size_tNS)

ส่งกลับมูลค่า: ฟังก์ชันจะคืนค่า 0 หากหน่วยความจำทั้งสองบล็อก ( NS ไบต์) เท่ากัน; มิฉะนั้น จะคืนค่าความแตกต่างระหว่างคู่ของไบต์ที่ไม่ตรงกันคู่แรก (ไบต์จะถูกตีความว่าเป็นอ็อบเจ็กต์ถ่านที่ไม่ได้ลงนาม จากนั้นจึงเลื่อนระดับเป็น int)

ตัวอย่าง คืนมูลค่า คำอธิบาย
memcmp( สวัสดีชาวโลก สวัสดีชาวโลก5 ) 0 5 ตัวอักษรแรกเหมือนกัน
memcmp( สวัสดี″,สวัสดี โลก,8 ) จำนวนเต็มลบ อักขระ 6 ตัวแรกเหมือนกัน แต่อักขระตัวที่ 7 ต่างกัน ที่นี่การเปรียบเทียบไม่หยุดเหมือน strncmp() เมื่อได้รับอักขระ ''
memcmp( สวัสดีชาวโลก สวัสดีชาวโลก 11 ) จำนวนเต็มลบ ค่า ASCII ของอักขระตัวแรกที่ไม่ตรงกันของสตริงแรก ('H') น้อยกว่าสตริงที่สอง ('h')

ตัวอย่าง:

ต่อไปนี้เป็นตัวอย่างโค้ด C ของฟังก์ชันทั้งหมดที่กล่าวถึง

01./*stringCompare.c*/
02.
03.#รวม
04.#รวม
05.
06.intหลัก()
07.{
08. printf ('strcmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ) => %dNS', strcmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ));
09. printf ('strcmp( 'สวัสดี','สวัสดี\0โลก' ) => %dNS', strcmp ( 'สวัสดี','สวัสดี 0โลก' ));
10. printf ('strcmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ) => %dNS', strcmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ) );
สิบเอ็ด. printf ('strcmp( 'สวัสดี\0\0\0','สวัสดี\0โลก' ) => %dNS', strcmp ( 'สวัสดี 0 0 0','สวัสดี 0โลก' ));
12.
13. printf ('NS---------------NS');
14.
สิบห้า. printf ('strncmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) => %dNS', strncmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ));
16. printf ('strncmp( 'สวัสดี','สวัสดี\0โลก',5 ) => %dNS', strncmp ( 'สวัสดี','สวัสดี 0โลก',5 ));
17. printf ('strncmp( 'สวัสดี\0\0\0','สวัสดี\0โลก',8 ) => %dNS', strncmp ( 'สวัสดี 0 0 0','สวัสดี 0โลก',8 ));
18. printf ('strncmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) => %dNS', strncmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ));
19.
ยี่สิบ. printf ('NS---------------NS');
ยี่สิบเอ็ด.
22. printf ('strcasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ) => %dNS',strcasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ));
2. 3. printf ('strcasecmp( 'สวัสดี','สวัสดี\0โลก' ) => %dNS',strcasecmp( 'สวัสดี','สวัสดี 0โลก' ));
24. printf ('strcasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ) => %dNS',strcasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก' ));
25.
26. printf ('NS---------------NS');
27.
28. printf ('strncasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) => %dNS',strncasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) );
29. printf ('strncasecmp( 'สวัสดี','สวัสดี\0โลก',5 ) => %dNS',strncasecmp( 'สวัสดี','สวัสดี 0โลก',5 ));
30. printf ('strncasecmp( 'สวัสดี\0\0\0','สวัสดี\0โลก',8 ) => %dNS',strncasecmp( 'สวัสดี 0 0 0','สวัสดี 0โลก',8 ));
31. printf ('strncasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) => %dNS',strncasecmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ));
32.
33. printf ('NS---------------NS');
3. 4.
35. printf ('memcmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) => %dNS', memcmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก',5 ) );
36. printf ('memcmp( 'สวัสดี\0\0\0','สวัสดี\0โลก',8 ) => %dNS', memcmp ( 'สวัสดี 0 0 0','สวัสดี 0โลก',8 ));
37. printf ('memcmp( 'สวัสดีชาวโลก','สวัสดีชาวโลก',11 ) => %dNS', memcmp ( 'สวัสดีชาวโลก','สวัสดีชาวโลก',สิบเอ็ด ));
38.
39.กลับ 0; 40.}

บทสรุป:

ดังนั้น ในบทช่วยสอนนี้ เราได้เห็นแล้วว่าสามารถเปรียบเทียบสตริงได้หลายวิธี ดังที่เราได้เห็นแล้ว ฟังก์ชัน stringCompare() จะคืนค่า -1 สำหรับสตริงที่ไม่เท่ากัน แต่สิ่งนี้สามารถแก้ไขได้เพื่อให้ส่งกลับค่า ASCII ของอักขระที่ไม่ตรงกัน คุณสามารถใช้มันในรหัสของคุณ ซึ่งเหมาะที่สุดสำหรับคุณ