تصنيف الأحرف C

تصنيف الأحرف في لغة C هو مجموعة من العمليات في مكتبة C القياسية التي تختبر انتماء حرف ما إلى فئة معينة من الأحرف، مثل الأحرف الأبجدية أو أحرف التحكم. يدعم هذا التصنيف الأحرف أحادية البايت والأحرف العريضة. [ 1 ]

تاريخ

ابتكر مبرمجو لغة C الأوائل الذين عملوا على نظام التشغيل يونكس أساليب برمجية لتصنيف الأحرف. على سبيل المثال، يُقيّم الكود التالي على أنه صحيح بالنسبة لحرف ASCII :c

( 'A' <= c && c <= 'Z' ) || ( 'a' <= c && c <= 'z' )

في النهاية، تم ترميز واجهة وظائف تصنيف الأحرف الشائعة في ملف مكتبة C القياسي ctype.h .

تطبيق

لتحسين الأداء، تُنفَّذ وظائف تصنيف الأحرف القياسية عادةً باستخدام وحدات الماكرو بدلاً من الدوال . ولكن، نظرًا لقيود تقييم وحدات الماكرو، فإنها لا تُنفَّذ اليوم كما كانت في الإصدارات الأولى من لينكس، مثل:

#define isdigit(c) ((c) >= '0' && (c) <= '9')

xقد يؤدي هذا إلى حدوث خطأ عند توسيع مُعامل الماكرو إلى تعبير ذي تأثير جانبي ؛ على سبيل المثال: isdigit(x++)إذا كان التنفيذ دالة، فسيتم زيادة قيمة x مرة واحدة فقط. ولكن في تعريف الماكرو هذا، يتم زيادتها مرتين.

للتغلب على هذه المشكلة، يتمثل أحد الحلول الشائعة في استخدام البحث في الجداول داخل الماكرو. على سبيل المثال، توفر المكتبة القياسية مصفوفة من 256 عددًا صحيحًا - عدد صحيح لكل قيمة حرفية - يحتوي كل منها على حقل بت لكل تصنيف مدعوم. يشير الماكرو إلى عدد صحيح بواسطة فهرس قيمة الحرف، ثم يصل إلى حقل البت المرتبط به. على سبيل المثال، إذا كان البت الأدنى يشير إلى ما إذا كان الحرف رقمًا، isdigitفيمكن كتابة الماكرو على النحو التالي:

#define isdigit(c) (TABLE[c] & 1)

يتم الرجوع إلى وسيط الماكرو، c، مرة واحدة فقط، وبالتالي يتم تقييمه مرة واحدة فقط.

نظرة عامة على الوظائف

تُعرَّف الدوال التي تعمل على الأحرف أحادية البايت في ملف الرأس ctype.h ( cctype في لغة C++). أما الدوال التي تعمل على الأحرف العريضة فتُعرَّف في ملف الرأس wctype.h ( cwctype في لغة C++).

يتم تقييم التصنيف وفقًا للموقع الفعلي.

حرف البايتشخصية واسعةوصف
isalnumiswalnumيتحقق مما إذا كان المعامل أبجديًا رقميًا
isalphaiswalphaيتحقق مما إذا كان المعامل أبجديًا
isloweriswlowerيتحقق مما إذا كان المعامل بأحرف صغيرة
isupperiswupperيتحقق مما إذا كان المعامل حرفًا كبيرًا
isdigitiswdigitيتحقق مما إذا كان المعامل رقمًا
isxdigitiswxdigitيتحقق مما إذا كان المعامل سداسيًا عشريًا
iscntrliswcntrlيتحقق مما إذا كان المعامل حرف تحكم
isgraphiswgraphيتحقق مما إذا كان المعامل عبارة عن حرف رسومي
isspaceiswspaceيتحقق مما إذا كان المعامل مسافة
isblankiswblankيتحقق مما إذا كان المعامل عبارة عن حرف مسافة فارغة
isprintiswprintيتحقق مما إذا كان المعامل حرفًا قابلاً للطباعة
ispunctiswpunctيتحقق مما إذا كان المعامل عبارة عن علامة ترقيم
tolowertowlowerيحوّل المعامل إلى أحرف صغيرة
touppertowupperيحوّل المعامل إلى أحرف كبيرة
غير متوفرiswctypeيتحقق مما إذا كان المعامل يندرج ضمن فئة محددة
غير متوفرtowctransيقوم بتحويل المعامل باستخدام عملية تعيين محددة
غير متوفرwctypeيُعيد فئة أحرف عريضة لاستخدامها معiswctype
غير متوفرwctransيُعيد هذا الأمر تعيين تحويل لاستخدامه معtowctrans

مراجع

  1. مواصفات ISO/IEC 9899:1999 (PDF) . ص 193، § 7.4.