تصنيف الأحرف 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++).
يتم تقييم التصنيف وفقًا للموقع الفعلي.
| حرف البايت | شخصية واسعة | وصف |
|---|---|---|
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 |
مراجع
- ↑ مواصفات ISO/IEC 9899:1999 (PDF) . ص 193، § 7.4.
روابط خارجية
- مكتبة C القياسية
