دوال التعامل مع السلاسل النصية والوقت والتاريخ في لغة C
تُعتبر لغة C واحدة من أقدم وأهم لغات البرمجة التي ما تزال تحتفظ بمكانتها إلى اليوم، بفضل مرونتها وكفاءتها في التعامل مع الموارد منخفضة المستوى، خاصة في نظم التشغيل والتطبيقات التي تتطلب أداءً عاليًا. من بين المهام التي تفرضها التطبيقات البرمجية المختلفة، تأتي التعامل مع السلاسل النصية، والوقت والتاريخ، كأحد العناصر الأساسية التي يحتاج المبرمج إلى فهمها بشكل عميق واستعمال دوالها بكفاءة.
يتناول هذا المقال شرحًا موسعًا ومفصلًا حول الدوال الخاصة بالتعامل مع السلاسل النصية (Strings) ودوال الوقت والتاريخ (Time and Date) في لغة C، مع تقديم شرح عملي لكيفية استخدامها، وأهم المكتبات التي تحتويها، مع أمثلة عملية وأيضًا توضيح لبعض المفاهيم المرتبطة بها.
مقدمة عن السلاسل النصية في لغة C
في لغة C، لا توجد نوع بيانات مدمج للسلاسل النصية كما في لغات أخرى مثل Python أو Java. بدلاً من ذلك، تمثل السلاسل النصية في C كمصفوفة من الأحرف (Character Array) تُنهي بحرف خاص يُسمى حرف النهاية \0 (null character). لذا، التعامل مع النصوص يتطلب فهمًا دقيقًا لهذه البنية وكيفية استخدام الدوال المناسبة الموجودة في مكتبة C القياسية ().
مفهوم السلاسل النصية (Strings) في C
السلسلة النصية هي ببساطة مجموعة متتالية من الأحرف يتم تخزينها في مصفوفة من نوع char، ويتميز نص لغة C بضرورة وجود الحرف \0 في نهاية هذه المصفوفة، مما يتيح للبرنامج معرفة نقطة انتهاء السلسلة النصية.
مثال على تعريف سلسلة نصية:
cchar str[20] = "Hello, World!";
هنا يتم تخصيص مصفوفة بحجم 20 خانة، ويوضع النص “Hello, World!” مع حرف النهاية \0 تلقائيًا.
دوال التعامل مع السلاسل النصية في مكتبة
تحتوي مكتبة string.h على مجموعة واسعة من الدوال التي تساعد في التعامل مع النصوص بسهولة، منها:
1. دالة strlen
تقيس طول السلسلة النصية (عدد الأحرف قبل \0).
csize_t strlen(const char *str);
مثال:
cchar str[] = "Example";
printf("Length: %zu\n", strlen(str)); // الناتج: 7
2. دالة strcpy
تقوم بنسخ سلسلة نصية إلى أخرى.
cchar *strcpy(char *dest, const char *src);
مثال:
cchar src[] = "Copy this";
char dest[20];
strcpy(dest, src);
3. دالة strncpy
نسخة آمنة من strcpy حيث يمكن تحديد الحد الأقصى لعدد الأحرف المنسوخة.
cchar *strncpy(char *dest, const char *src, size_t n);
4. دالة strcat
تستخدم لإلحاق سلسلة نصية بنهاية أخرى.
cchar *strcat(char *dest, const char *src);
مثال:
cchar str1[20] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2); // str1 تصبح "Hello, World!"
5. دالة strcmp
لمقارنة سلسلتين نصيتين.
cint strcmp(const char *str1, const char *str2);
تُرجع القيمة صفر إذا كانت السلسلتان متطابقتين، قيمة سالبة إذا كانت الأولى أقل من الثانية، وقيمة موجبة إذا كانت الأولى أكبر.
6. دالة strchr
للبحث عن أول ظهور لحرف معين داخل سلسلة نصية.
cchar *strchr(const char *str, int c);
7. دالة strstr
للبحث عن سلسلة نصية داخل أخرى.
cchar *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.
ctime_t time(time_t *t);
مثال:
ctime_t now;
now = time(NULL);
printf("Current time: %ld\n", now);
2. دالة localtime
تحول قيمة time_t إلى هيكل tm يمثل الوقت المحلي.
cstruct tm *localtime(const time_t *timer);
مثال:
ctime_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
تستخدم لتحويل الوقت إلى سلسلة نصية حسب تنسيق محدد.
csize_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
مثال:
cchar 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 وتُرجع عدد الثواني بينهما.
cdouble 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 كمهنة وتقنية.
المصادر والمراجع
-
The C Programming Language, Brian W. Kernighan and Dennis M. Ritchie, 2nd Edition, 1988.
-
ISO/IEC 9899:2018 – Programming languages — C, ISO Standard, 2018.
المقال يتناول شرحًا وافيًا لدوال التعامل مع النصوص والوقت والتاريخ في لغة C، ويغطي الجوانب النظرية والعملية، بالإضافة إلى التنبيهات التقنية المهمة التي تضمن كتابة برامج آمنة وفعالة.

