อ่าน 2 นาที
การจำแนกประเภทตัวอักษร C
การจำแนกประเภทอักขระ Cเป็นกลุ่มของการดำเนินการในไลบรารีมาตรฐาน Cที่ทดสอบอักขระว่าเป็นสมาชิกของกลุ่มอักขระใดโดยเฉพาะ เช่น อักขระตัวอักษรหรืออักขระควบคุม...
การจำแนกประเภทตัวอักษร C
| ไลบรารีมาตรฐาน C (libc) |
|---|
| หัวข้อทั่วไป |
| ส่วนหัวเบ็ดเตล็ด |
การจำแนกประเภทอักขระ Cเป็นกลุ่มของการดำเนินการในไลบรารีมาตรฐาน Cที่ทดสอบอักขระว่าเป็นสมาชิกของกลุ่มอักขระใดโดยเฉพาะ เช่น อักขระตัวอักษรหรืออักขระควบคุม รองรับทั้งอักขระไบต์เดียวและอักขระกว้าง[ 1 ]
ประวัติศาสตร์
โปรแกรมเมอร์ภาษาซี ในยุคแรกๆที่ทำงานกับระบบปฏิบัติการUnix ได้พัฒนา รูปแบบการเขียนโปรแกรมเพื่อจำแนกประเภทของอักขระ ตัวอย่างเช่นโค้ด ต่อไปนี้ จะประเมินค่าเป็นจริงสำหรับอักขระตัวอักษรASCII : c
( 'A' <= c && c <= 'Z' ) || ( 'a' <= c && c <= 'z' )ในที่สุด อินเทอร์เฟซสำหรับฟังก์ชันการจำแนกประเภทอักขระทั่วไปก็ได้รับการกำหนดไว้ในไฟล์ไลบรารีมาตรฐาน C ที่ ชื่อ ctype.h
การดำเนินการ
เพื่อประสิทธิภาพที่ดีขึ้น ฟังก์ชันการจำแนกประเภทอักขระมาตรฐานมักถูกนำไปใช้ในรูปแบบมาโครแทนที่จะเป็นฟังก์ชันแต่เนื่องจากข้อจำกัดของการประเมินมาโคร ปัจจุบันจึงโดยทั่วไปแล้วไม่ได้ถูกนำมาใช้ในรูปแบบเดียวกับในLinux เวอร์ชันแรกๆ เช่น:
#define isdigit(c) ((c) >= '0' && (c) <= '9')สิ่งนี้อาจนำไปสู่ข้อผิดพลาดเมื่อพารามิเตอร์มาโครxถูกขยายเป็นนิพจน์ที่มีผลข้างเคียงตัวอย่างเช่น: isdigit(x++)หากการใช้งานเป็นฟังก์ชัน ค่า x จะเพิ่มขึ้นเพียงครั้งเดียว แต่สำหรับคำจำกัดความมาโครนี้ ค่า x จะเพิ่มขึ้นสองครั้ง
เพื่อแก้ไขปัญหานี้ วิธีการใช้งานทั่วไปคือการใช้การค้นหาในตารางสำหรับมาโคร ตัวอย่างเช่น ไลบรารีมาตรฐานมีอาร์เรย์ของจำนวนเต็ม 256 ตัว – หนึ่งตัวสำหรับค่าอักขระแต่ละค่า – ซึ่งแต่ละตัวประกอบด้วยฟิลด์บิตสำหรับแต่ละการจำแนกประเภทที่รองรับ มาโครจะอ้างอิงถึงจำนวนเต็มโดยใช้ดัชนีค่าอักขระและเข้าถึงฟิลด์บิตที่เกี่ยวข้อง ตัวอย่างเช่น หากบิตต่ำสุดระบุว่าอักขระนั้นเป็นตัวเลขหรือไม่isdigitมาโครสามารถเขียนได้ดังนี้:
#define isdigit(c) (TABLE[c] & 1)อาร์กิวเมนต์มาโครcถูกอ้างอิงเพียงครั้งเดียว ดังนั้นจึงถูกประเมินเพียงครั้งเดียว
ภาพรวมของฟังก์ชันต่างๆ
ฟังก์ชันที่ใช้กับอักขระแบบไบต์เดียวถูกกำหนดไว้ในไฟล์เฮดเดอร์ctype.h ( cctypeใน C++) ส่วนฟังก์ชันที่ใช้กับอักขระแบบไบต์กว้างถูกกำหนดไว้ในไฟล์เฮดเดอร์wctype.h ( cwctypeใน C++)
การจัดประเภทจะได้รับการประเมินตามสถานที่ตั้งที่มีผลบังคับใช้
| อักขระไบต์ | ลักษณะ กว้าง | คำอธิบาย |
|---|---|---|
isalnum | iswalnum | ตรวจสอบว่าตัวถูกดำเนินการเป็นตัวอักษรและตัวเลขหรือไม่ |
isalpha | iswalpha | ตรวจสอบว่าตัวถูกดำเนินการเป็นตัวอักษรหรือไม่ |
islower | iswlower | ตรวจสอบว่าตัวถูกดำเนินการเป็นตัวพิมพ์เล็กหรือไม่ |
isupper | iswupper | ตรวจสอบว่าตัวถูกดำเนินการเป็นตัวพิมพ์ใหญ่หรือไม่ |
isdigit | iswdigit | ตรวจสอบว่าตัวถูกดำเนินการเป็นตัวเลขหรือไม่ |
isxdigit | iswxdigit | ตรวจสอบว่าตัวถูกดำเนินการเป็นเลขฐานสิบหกหรือไม่ |
iscntrl | iswcntrl | ตรวจสอบว่าตัวถูกดำเนินการเป็นอักขระควบคุมหรือไม่ |
isgraph | iswgraph | ตรวจสอบว่าตัวถูกดำเนินการเป็นอักขระกราฟิกหรือไม่ |
isspace | iswspace | ตรวจสอบว่าตัวถูกดำเนินการเป็นช่องว่าง หรือไม่ |
isblank | iswblank | ตรวจสอบว่าตัวถูกดำเนินการเป็นอักขระช่องว่างหรือไม่ |
isprint | iswprint | ตรวจสอบว่าตัวถูกดำเนินการเป็นอักขระที่พิมพ์ได้หรือไม่ |
ispunct | iswpunct | ตรวจสอบว่าตัวถูกดำเนินการเป็นเครื่องหมายวรรคตอนหรือไม่ |
tolower | towlower | แปลงตัวถูกดำเนินการเป็นตัวพิมพ์เล็ก |
toupper | towupper | แปลงตัวถูกดำเนินการเป็นตัวพิมพ์ใหญ่ |
| ไม่มีข้อมูล | iswctype | ตรวจสอบว่าตัวถูกดำเนินการนั้นอยู่ในคลาสที่กำหนดหรือไม่ |
| ไม่มีข้อมูล | towctrans | แปลงตัวถูกดำเนินการโดยใช้การแมปเฉพาะ |
| ไม่มีข้อมูล | wctype | ส่งคืนคลาสอักขระกว้างเพื่อนำไปใช้กับiswctype |
| ไม่มีข้อมูล | wctrans | ส่งคืนแผนที่การแปลงที่จะนำไปใช้กับtowctrans |
ลิงก์ภายนอก
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การจำแนกประเภทตัวอักษร C
การจำแนกประเภทอักขระ Cเป็นกลุ่มของการดำเนินการในไลบรารีมาตรฐาน Cที่ทดสอบอักขระว่าเป็นสมาชิกของกลุ่มอักขระใดโดยเฉพาะ เช่น อักขระตัวอักษรหรืออักขระควบคุม...
ประวัติศาสตร์
โปรแกรมเมอร์ ภาษาซี ในยุคแรกๆที่ทำงานกับระบบปฏิบัติการ Unix ได้พัฒนา รูปแบบการเขียนโปรแกรม เพื่อจำแนกประเภทของอักขระ ตัวอย่างเช่น โค้ด ต่อไปนี้ จะประเมินค่าเป็น จริง สำหรับอักขระตัวอักษร ASCII : c
การดำเนินการ
เพื่อประสิทธิภาพที่ดีขึ้น ฟังก์ชันการจำแนกประเภทอักขระมาตรฐานมักถูกนำไปใช้ในรูปแบบมาโครแทนที่จะเป็น ฟังก์ชัน แต่เนื่องจากข้อจำกัดของการประเมินมาโคร ปัจจุบันจึงโดยทั่วไปแล้วไม่ได้ถูกนำมาใช้ในรูปแบบเดียวกับใน Linux เวอร์ชันแรกๆ เช่น:
ภาพรวมของฟังก์ชันต่างๆ
ฟังก์ชันที่ใช้กับอักขระแบบไบต์เดียวถูกกำหนดไว้ในไฟล์เฮดเดอร์ ctype.h ( cctype ใน C++) ส่วนฟังก์ชันที่ใช้กับอักขระแบบไบต์กว้างถูกกำหนดไว้ในไฟล์เฮดเดอร์ wctype.h ( cwctype ใน C++)