البرمجة

دوال السلاسل النصية والتاريخ في C

دوال التعامل مع السلاسل النصية والوقت والتاريخ في لغة C

تُعتبر لغة C واحدة من أقدم وأهم لغات البرمجة التي ما تزال تحتفظ بمكانتها إلى اليوم، بفضل مرونتها وكفاءتها في التعامل مع الموارد منخفضة المستوى، خاصة في نظم التشغيل والتطبيقات التي تتطلب أداءً عاليًا. من بين المهام التي تفرضها التطبيقات البرمجية المختلفة، تأتي التعامل مع السلاسل النصية، والوقت والتاريخ، كأحد العناصر الأساسية التي يحتاج المبرمج إلى فهمها بشكل عميق واستعمال دوالها بكفاءة.

يتناول هذا المقال شرحًا موسعًا ومفصلًا حول الدوال الخاصة بالتعامل مع السلاسل النصية (Strings) ودوال الوقت والتاريخ (Time and Date) في لغة C، مع تقديم شرح عملي لكيفية استخدامها، وأهم المكتبات التي تحتويها، مع أمثلة عملية وأيضًا توضيح لبعض المفاهيم المرتبطة بها.


مقدمة عن السلاسل النصية في لغة C

في لغة C، لا توجد نوع بيانات مدمج للسلاسل النصية كما في لغات أخرى مثل Python أو Java. بدلاً من ذلك، تمثل السلاسل النصية في C كمصفوفة من الأحرف (Character Array) تُنهي بحرف خاص يُسمى حرف النهاية \0 (null character). لذا، التعامل مع النصوص يتطلب فهمًا دقيقًا لهذه البنية وكيفية استخدام الدوال المناسبة الموجودة في مكتبة C القياسية ().

مفهوم السلاسل النصية (Strings) في C

السلسلة النصية هي ببساطة مجموعة متتالية من الأحرف يتم تخزينها في مصفوفة من نوع char، ويتميز نص لغة C بضرورة وجود الحرف \0 في نهاية هذه المصفوفة، مما يتيح للبرنامج معرفة نقطة انتهاء السلسلة النصية.

مثال على تعريف سلسلة نصية:

c
char str[20] = "Hello, World!";

هنا يتم تخصيص مصفوفة بحجم 20 خانة، ويوضع النص “Hello, World!” مع حرف النهاية \0 تلقائيًا.


دوال التعامل مع السلاسل النصية في مكتبة

تحتوي مكتبة string.h على مجموعة واسعة من الدوال التي تساعد في التعامل مع النصوص بسهولة، منها:

1. دالة strlen

تقيس طول السلسلة النصية (عدد الأحرف قبل \0).

c
size_t strlen(const char *str);

مثال:

c
char str[] = "Example"; printf("Length: %zu\n", strlen(str)); // الناتج: 7

2. دالة strcpy

تقوم بنسخ سلسلة نصية إلى أخرى.

c
char *strcpy(char *dest, const char *src);

مثال:

c
char src[] = "Copy this"; char dest[20]; strcpy(dest, src);

3. دالة strncpy

نسخة آمنة من strcpy حيث يمكن تحديد الحد الأقصى لعدد الأحرف المنسوخة.

c
char *strncpy(char *dest, const char *src, size_t n);

4. دالة strcat

تستخدم لإلحاق سلسلة نصية بنهاية أخرى.

c
char *strcat(char *dest, const char *src);

مثال:

c
char str1[20] = "Hello, "; char str2[] = "World!"; strcat(str1, str2); // str1 تصبح "Hello, World!"

5. دالة strcmp

لمقارنة سلسلتين نصيتين.

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

تُرجع القيمة صفر إذا كانت السلسلتان متطابقتين، قيمة سالبة إذا كانت الأولى أقل من الثانية، وقيمة موجبة إذا كانت الأولى أكبر.

6. دالة strchr

للبحث عن أول ظهور لحرف معين داخل سلسلة نصية.

c
char *strchr(const char *str, int c);

7. دالة strstr

للبحث عن سلسلة نصية داخل أخرى.

c
char *strstr(const char *haystack, const char *needle);

أهمية التعامل مع السلاسل النصية بدقة

عدم التعامل الصحيح مع السلاسل النصية قد يؤدي إلى مشاكل خطيرة مثل تجاوز حدود المصفوفة (Buffer Overflow)، مما يسبب أعطالًا في البرنامج أو ثغرات أمنية. لذلك، ينبغي استخدام الدوال الآمنة مثل strncpy، والحرص على تخصيص حجم كافٍ للمصفوفة النصية.


التعامل مع الوقت والتاريخ في لغة C

تعد مكتبة الوقت والتاريخ في C من الأدوات المهمة للتحكم في البيانات الزمنية، وتحويلها، وقياس الفترات الزمنية، وإجراء العمليات عليها، وهي متوفرة عبر مكتبة .


المكونات الأساسية لمكتبة الوقت والتاريخ

تحتوي مكتبة time.h على مجموعة من الثوابت، الأنواع، والدوال التي تساعد على التعامل مع الوقت والتاريخ، ومنها:

  • نوع البيانات time_t: يمثل الوقت في شكل عدد الثواني منذ بداية “العصر” (Epoch)، الذي هو عادة 1 يناير 1970.

  • هيكل struct tm: يحتوي على تفاصيل مكونات الوقت والتاريخ (السنة، الشهر، اليوم، الساعة، الدقيقة، الثانية).

  • دوال للتعامل مع الوقت والتاريخ مثل time(), localtime(), gmtime(), strftime(), و difftime().


شرح بعض الدوال المهمة في

1. دالة time

تُرجع الوقت الحالي كنقطة زمنية من نوع time_t.

c
time_t time(time_t *t);

مثال:

c
time_t now; now = time(NULL); printf("Current time: %ld\n", now);

2. دالة localtime

تحول قيمة time_t إلى هيكل tm يمثل الوقت المحلي.

c
struct tm *localtime(const time_t *timer);

مثال:

c
time_t now = time(NULL); struct tm *local = localtime(&now); printf("Year: %d\n", local->tm_year + 1900); // tm_year يبدأ من 1900

3. دالة gmtime

تشبه localtime لكنها تُرجع الوقت بتوقيت غرينتش (UTC).

4. دالة strftime

تستخدم لتحويل الوقت إلى سلسلة نصية حسب تنسيق محدد.

c
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

مثال:

c
char buffer[80]; time_t now = time(NULL); struct tm *local = localtime(&now); strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local); printf("Formatted date and time: %s\n", buffer);

5. دالة difftime

تحسب الفرق بين وقتين من نوع time_t وتُرجع عدد الثواني بينهما.

c
double difftime(time_t end, time_t beginning);

التفاصيل المهمة عند التعامل مع الوقت والتاريخ

  • الوقت في time_t يُحسب بعدد الثواني منذ 1970-01-01 00:00:00 UTC.

  • عند استخدام localtime و gmtime يجب الحذر من أن دوالهما تُرجع مؤشرًا إلى هيكل مشترك قد يتغير في كل استدعاء.

  • تنسيق strftime يمكنه دعم تنسيقات عديدة حسب الحاجة مثل: %Y للسنة، %m للشهر، %d لليوم، %H للساعة (24 ساعة)، %M للدقائق، و %S للثواني.


استعراض عملي شامل

مثال برمجي يجمع بين السلاسل النصية والوقت والتاريخ

c
#include #include #include int main() { // تعريف مصفوفة نصية char dateStr[100]; // الحصول على الوقت الحالي time_t now = time(NULL); // تحويل الوقت إلى الوقت المحلي struct tm *local = localtime(&now); // تنسيق الوقت إلى سلسلة نصية strftime(dateStr, sizeof(dateStr), "اليوم: %A، التاريخ: %d-%m-%Y، الوقت: %H:%M:%S", local); // عرض السلسلة النصية النهائية printf("%s\n", dateStr); return 0; }

تحليل الكود

في المثال السابق، يتم أخذ الوقت الحالي وتحويله إلى تمثيل محلي، ثم يُستخدم strftime لإنشاء سلسلة نصية مُنسقة تحتوي على اليوم، التاريخ، والوقت بتنسيق عربي. هذا يجمع بين القدرة على التعامل مع الوقت كسلسلة نصية واستعمال الدوال النصية في نفس الوقت.


مقارنة بين بعض الدوال النصية الأكثر استخدامًا

في الجدول التالي ملخص لأهم دوال السلاسل النصية مع توضيح الوظيفة، النتيجة، وملاحظات الاستخدام:

الدالة الوظيفة نوع القيمة المرجعة ملاحظات هامة
strlen حساب طول السلسلة النصية size_t (عدد صحيح) لا تشمل حرف النهاية \0
strcpy نسخ سلسلة نصية إلى أخرى مؤشر إلى الوجهة يجب ضمان أن الوجهة كافية للحجم
strncpy نسخ عدد محدد من الأحرف مؤشر إلى الوجهة مفيدة لتجنب تجاوز الحجم
strcat إلحاق سلسلة نصية في نهاية أخرى مؤشر إلى الوجهة يجب التأكد من حجم الوجهة
strcmp مقارنة سلسلتين نصيتين int 0 عند التطابق، موجبة أو سالبة بخلاف
strchr إيجاد أول ظهور لحرف مؤشر إلى الحرف داخل السلسلة NULL إذا لم يُعثر على الحرف
strstr إيجاد سلسلة نصية داخل أخرى مؤشر إلى بداية النص الفرعي NULL إذا لم يُعثر على النص

دوال الوقت والتاريخ – ملخص الجدول

الدالة الوظيفة النوع المرجع الملاحظات
time الحصول على الوقت الحالي time_t يمثل الوقت بالثواني منذ 1970
localtime تحويل الوقت إلى الوقت المحلي مؤشر إلى struct tm يجب الحذر عند الاستخدام المتعدد
gmtime تحويل الوقت إلى توقيت UTC مؤشر إلى struct tm يُرجع الوقت حسب توقيت غرينتش
strftime تنسيق الوقت كسلسلة نصية عدد الأحرف المكتوبة يدعم تنسيقات متعددة
difftime حساب فرق الزمن بين وقتين double (الثواني) الفرق بين وقتين من نوع time_t

ملاحظات مهمة حول الأداء والأمان

  • في عمليات النسخ والنصوص الكبيرة، من الأفضل استخدام دوال النسخ الآمنة مثل strncpy لتفادي تجاوز الحدود، مما يعزز أمان البرامج.

  • التعامل مع الوقت والتاريخ يتطلب الانتباه لمنطقة التوقيت (Time Zone)، خاصة إذا كان التطبيق متعدد المناطق.

  • تحويل الوقت من وإلى تمثيلات نصية مهمة جدًا لعمليات التخزين، العرض، والمعالجة، ويجب مراعاة التنسيق المناسب للغرض.

  • مكتبة الوقت في C لا توفر دوال متقدمة للتحكم بالمناطق الزمنية (مثل التوقيت الصيفي)، لذلك يحتاج المطور إلى استخدام مكتبات إضافية أو التوسع في البرمجة.


خاتمة

تشكّل دوال التعامل مع السلاسل النصية والوقت والتاريخ في لغة C حجر الأساس لأي برنامج يحتاج إلى معالجة النصوص أو توقيت الأحداث الزمنية. تتيح مكتبات string.h و time.h مجموعة متكاملة من الدوال التي تخدم هذه الوظائف، وتتطلب مهارة في الاستخدام لضمان الأداء والكفاءة والأمان.

مع التمكن من هذه الدوال، يستطيع المبرمج بناء تطبيقات متقدمة قادرة على التعامل مع النصوص الديناميكية، تنظيم البيانات الزمنية، عرض التواريخ والأوقات بشكل مقروء، وحساب الفوارق الزمنية بدقة عالية. ويظل فهم طبيعة السلاسل النصية وكيفية إدارتها في الذاكرة، إلى جانب التحكم في الوقت والتاريخ، من العوامل الرئيسية التي تميز برمجة C كمهنة وتقنية.


المصادر والمراجع

  1. The C Programming Language, Brian W. Kernighan and Dennis M. Ritchie, 2nd Edition, 1988.

  2. ISO/IEC 9899:2018 – Programming languages — C, ISO Standard, 2018.


المقال يتناول شرحًا وافيًا لدوال التعامل مع النصوص والوقت والتاريخ في لغة C، ويغطي الجوانب النظرية والعملية، بالإضافة إلى التنبيهات التقنية المهمة التي تضمن كتابة برامج آمنة وفعالة.