strtok وتقسيم الرموز
تقسيم السلاسل
strtok وتقسيم الرموز درس مجاني في C Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
ما المقصود بالتقسيم إلى رموز؟
يعني التقسيم إلى رموز تجزئة سلسلة نصية إلى أجزاء أصغر (رموز) تفصل بينها محارف فاصلة.
فمثلاً، يؤدي تقسيم "a,b,c" عند الفواصل إلى الرموز a وb وc. توفّر لغة C الدالة strtok لهذا الغرض.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b,c";
char *token = strtok(text, ",");
printf("First token: %s\n", token);
return 0;
}توقيع strtok
char *strtok(char *str, const char *delim);
في الاستدعاء الأول تمرّرون السلسلة النصية. وفي الاستدعاءات اللاحقة تمرّرون NULL كي تتابع الدالة من الموضع الذي توقفت عنده. وتعيد الرمز التالي، أو NULL عند انتهاء الرموز.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "red green blue";
char *tok = strtok(text, " ");
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, " ");
}
return 0;
}تعدّل strtok السلسلة النصية
مهم: تغيّر strtok السلسلة النصية الأصلية. فهي تستبدل كل فاصل بـ '\0' وتعيد مؤشرات داخل المخزن المؤقت نفسه.
يعني ذلك أنه لا يمكنكم تقسيم سلسلة نصية ثابتة مثل "a,b"، لأنها للقراءة فقط.
#include <stdio.h>
#include <string.h>
int main(void) {
char data[] = "x:y:z";
strtok(data, ":");
printf("data[1] is now: %d (the null byte)\n", data[1]);
return 0;
}إنشاء نسخة قابلة للكتابة
بما أن strtok تتلف الإدخال الذي تتلقاه، انسخوا السلسلة النصية أولاً إذا كنتم بحاجة إلى الأصل لاحقاً.
استخدموا مصفوفة محلية من النوع char أو انسخوا باستخدام strcpy إلى مخزن مؤقت.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *original = "one-two-three";
char copy[64];
strcpy(copy, original);
char *tok = strtok(copy, "-");
while (tok) {
printf("%s\n", tok);
tok = strtok(NULL, "-");
}
printf("Original intact: %s\n", original);
return 0;
}فواصل متعددة
الوسيط delim هو مجموعة من المحارف، وليس تسلسلاً. يعمل أي محرف في المجموعة فاصلاً.
لذلك تقسم " ,;" النص عند المسافات والفواصل والفواصل المنقوطة جميعاً في الوقت نفسه.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b;c d";
char *tok = strtok(text, ",; ");
while (tok) {
printf("[%s]\n", tok);
tok = strtok(NULL, ",; ");
}
return 0;
}الفواصل المتتالية
تتعامل strtok مع تتابعات الفواصل كفاصل واحد، وتتجاوز الرموز الفارغة.
لذلك تنتج "a,,b" الرمزَين a وb فقط، ولا تنتج رمزاً فارغاً بينهما. ضعوا ذلك في الحسبان عند تحليل CSV حيث تكون الحقول الفارغة مهمة.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,,b";
char *tok = strtok(text, ",");
while (tok) {
printf("token: %s\n", tok);
tok = strtok(NULL, ",");
}
return 0;
}عدّ الرموز
من المهام الشائعة عدّ عدد الرموز التي تحتويها سلسلة نصية. زيدوا عدّاداً داخل الحلقة.
#include <stdio.h>
#include <string.h>
int main(void) {
char sentence[] = "the quick brown fox";
int count = 0;
char *tok = strtok(sentence, " ");
while (tok) {
count++;
tok = strtok(NULL, " ");
}
printf("Word count: %d\n", count);
return 0;
}تحتفظ strtok بحالة مخفية
تخزّن strtok موضعها في متغير داخلي ثابت. ولهذا يؤدي تمرير NULL إلى متابعة السلسلة النصية السابقة.
أما الجانب السلبي فهو أنها غير قابلة لإعادة الدخول وغير آمنة للاستخدام مع الخيوط. لا يمكنكم تقسيم سلسلتين نصيتين في الوقت نفسه.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "1 2";
char *t = strtok(a, " ");
printf("%s\n", t);
t = strtok(NULL, " ");
printf("%s\n", t);
return 0;
}تخزين الرموز
لاستخدام الرموز بعد التقسيم، خزّنوا المؤشرات المُعادة في مصفوفة. فهي تشير إلى داخل مخزن المصدر المعدّل الآن، ولذلك يجب أن يبقى هذا المخزن موجوداً.
#include <stdio.h>
#include <string.h>
int main(void) {
char csv[] = "name,age,city";
char *fields[10];
int n = 0;
char *tok = strtok(csv, ",");
while (tok && n < 10) {
fields[n++] = tok;
tok = strtok(NULL, ",");
}
for (int i = 0; i < n; i++)
printf("Field %d: %s\n", i, fields[i]);
return 0;
}البديل القابل لإعادة الدخول
توفّر POSIX الدالة strtok_r، التي تتلقى char **saveptr صريحاً بدلاً من الحالة المخفية. ويجعلها ذلك آمنة للتداخل والاستخدام عبر الخيوط.
أما في لغة C القياسية القابلة للنقل، فتكفي strtok العادية للتحليل بمرور واحد.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "p:q:r";
char *save;
char *tok = strtok_r(text, ":", &save);
while (tok) {
printf("%s\n", tok);
tok = strtok_r(NULL, ":", &save);
}
return 0;
}تطبيق عملي: تقسيم مسار
يكون تقسيم الرموز مفيداً عند تحليل نص منظم مثل مسارات الملفات. ويكشف التقسيم عند / كل مكوّن من مكوّنات المسار.
#include <stdio.h>
#include <string.h>
int main(void) {
char path[] = "usr/local/bin";
char *part = strtok(path, "/");
while (part) {
printf("-> %s\n", part);
part = strtok(NULL, "/");
}
return 0;
}تحقق سريع
اختبروا فهمكم لكيفية عمل strtok.
مراجعة
تعلّمتم تقسيم السلاسل النصية باستخدام strtok:
- يأخذ الاستدعاء الأول السلسلة النصية، بينما تأخذ الاستدعاءات اللاحقة NULL.
- تعدّل الدالة الإدخال، إذ تستبدل الفواصل بـ
'\0'— انسخوا السلاسل النصية للقراءة فقط أولاً. - وسيط الفواصل هو مجموعة؛ وتُدمج الفواصل المتتالية.
- تستخدم الدالة حالة ثابتة وليست آمنة للاستخدام مع الخيوط؛ استخدموا
strtok_rعند الحاجة.
تعلم C مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 39
- الدروس
- 144
الأسئلة الشائعة
هل درس «strtok وتقسيم الرموز» مجاني؟
نعم — نص درس «strtok وتقسيم الرموز» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «strtok وتقسيم الرموز»؟
تقسيم السلاسل تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «strtok وتقسيم الرموز»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- strlen وstrcpy وstrcat
- strcmp والمقارنة
- strtok وتقسيم الرموز
- memcpy وmemset