قائمة الطعام
مجانا
التسجيل
الصفحة الرئيسية  /  إنترنت/ وصف Strtok ق ج. وظائف لمعالجة السلاسل

وصف Strtok s c. وظائف لمعالجة السلاسل

4 إجابات

شيئين يجب معرفتهما عن strtok. كما ذكرنا ، فهي "تحافظ على دولة داخلية". علاوة على ذلك ، هو أفسدت الخط الذي تطعمه... بشكل أساسي ستكتب "\ 0" حيث ستجد العلامة التي قدمتها وتعيد المؤشر إلى بداية السطر. داخليًا ، يحافظ على موقع آخر رمز ؛ وفي المرة القادمة التي تسميها سيبدأ من هناك.

والنتيجة الطبيعية المهمة هي أنه لا يمكنك استخدام strtok على حرف ثابت * "hello world" ؛ نظرًا لأنك ستحصل على انتهاك وصول عند تغيير محتويات سلسلة الأحرف الثابتة.

"الشيء الجيد" في strtok هو أنه لا ينسخ السلاسل فعليًا ، لذلك لا تحتاج إلى إدارة عمليات تخصيص الذاكرة الإضافية وما إلى ذلك. ولكن إذا لم تفهم ما ورد أعلاه ، فستواجه مشكلات في استخدامه.

مثال. إذا كان لديك "هذا ، هو ، سلسلة" ، فإن الاستدعاءات المتتالية لـ strtok ستنشئ مؤشرات مثل هذه (القيمة ^ ​​هي القيمة المرجعة). لاحظ أنه يتم إضافة "\ 0" حيث توجد الرموز المميزة ؛ هذا يعني انه سلسلة المصدرتغير:

T الخاص به ، هو ، a ، سلسلة \ 0 هذه ، a ، سلسلة هذه \ 0 هي ، a ، سلسلة \ 0 هذا ^ هذا \ 0 هو \ 0 a ، سلسلة \ 0 هي ^ هذا \ 0 هي \ 0 أ \ سلسلة 0 \ 0 a ^ this \ 0 \ 0 a \ 0 string \ 0 string ^

أتمنى أن يكون هذا منطقيًا.

تخزن الوظيفة strtok () البيانات بين المكالمات. يستخدم هذه البيانات عندما تستدعيها بمؤشر NULL.

يتم تخزين النقطة التي تم فيها العثور على الرمز المميز الأخير داخليًا بواسطة وظيفة سيتم استخدامها في المكالمة التالية (لا يلزم تنفيذ خاص بالمكتبة لمنع فشل البيانات).

تحافظ strtok على الحالة الداخلية. عندما تستدعيها بـ non-NULL ، فإنها تعيد تهيئة نفسها لاستخدام السلسلة التي توفرها. عندما تستدعيها بـ NULL ، فإنها تستخدم تلك السلسلة وأي حالة أخرى تتلقاها حاليًا لإرجاع الرمز المميز التالي.

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

تقوم وظيفة strtok بتخزين البيانات في متغير ثابت داخلي يتم مشاركته بين جميع مؤشرات الترابط.

من أجل سلامة الخيط ، يجب استخدام strtok_r

ألقِ نظرة على الحرف الثابت * أخيرًا ؛

Char * strtok (s، delim) تسجيل الأحرف ؛ سجل const char * delim ؛ (سجل char * spanp ؛ سجل int c ، sc ؛ char * tok ؛ static char * last ؛ if (s == NULL && (s = last) == NULL) return (NULL) ؛ / * * تخطي (سبان) بادئة المحددات (s + = strspn (s ، delim) ، نوع من). * / cont: c = * s ++ ؛ لـ (spanp = (char *) delim ؛ (sc = * spanp ++)! = 0 ؛) (if (c == sc) goto cont؛) if (c == 0) (/ * لا توجد أحرف غير محددة * / last = NULL؛ return (NULL)؛) tok = s - 1؛ / * * Scan token (البحث عن المحددات: s + = strcspn (s، delim)، نوع من). * لاحظ أن delim يجب أن يحتوي على NUL واحد ؛ نتوقف إذا رأينا ذلك أيضًا. * / for (؛؛) (c = * s + +؛ spanp = (char *) delim؛ do (if ((sc = * spanp ++) == c) (if (c == 0) s = NULL؛ else s [-1] = 0 ؛ last = s ؛ return (tok)؛)) while (sc! = 0)؛) / * لم يتم الوصول إليها * /)

للمشاركه

اسم مستعار آخر

strtok

نظرة عامة

#تضمن

char * strtok (char *شارع، حرف كونستري *دليم);
char * strtok_r (char *شارع، حرف كونستري *دليم، شار **سافيبتر);

متطلبات الماكرو لاختبار الملكية لـ glibc (انظر ص. feature_test_macros(7)):

strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE> = 1 || _XOPEN_SOURCE || _POSIX_SOURCE

وصف

دور strtok() يقسم السلسلة إلى سلسلة من صفر أو أكثر من الرموز المميزة غير الفارغة. عند الاتصال الأول strtok() يجب تحديد السلسلة التي تم تحليلها في الوسيطة شارع... في كل استدعاء لاحق يوزع نفس السلسلة ، القيمة شارعيجب أن يكون NULL.

في الحجة دليميتم تحديد مجموعة من البايتات ، والتي تعتبر بمثابة فواصل رمزية في السلسلة التي تم تحليلها. يمكن للمتصل تحديد خطوط مختلفة بتنسيق دليمفي المكالمات اللاحقة عند تحليل نفس السلسلة.

كل مكالمة strtok() تُرجع مؤشرًا إلى سلسلة منتهية بقيمة خالية تحتوي على الرمز المميز التالي. لا يتضمن هذا السطر بايت محدد. إذا لم يكن هناك المزيد من الرموز المميزة ، إذن strtok() ترجع NULL.

تسلسل المكالمات strtok() ، التي تعمل على سلسلة واحدة ، تحافظ على مؤشر يحدد النقطة التي تبدأ عندها البحث عن الرمز المميز التالي. اول مكالمة strtok() يعين هذا المؤشر مرجعًا للبايت الأول من السلسلة. يتم تحديد بداية الرمز المميز التالي من خلال البحث إلى الأمام في شارعالبايت التالي ليس محددًا. إذا تم العثور على بايت ، فسيتم اعتباره بداية الرمز المميز التالي. إذا لم يتم العثور على مثل هذا البايت ، فلن يكون هناك المزيد من الرموز المميزة و strtok() ترجع NULL (لسلسلة فارغة أو تتكون فقط من المحددات في هذه الحالة ، سيتم إرجاع NULL في الاستدعاء الأول strtok()).

يتم البحث في نهاية كل رمز إلى الأمام حتى يتم العثور على بايت محدد أو بايت فارغ منتهي ("\ 0"). إذا تم العثور على بايت محدد ، فسيتم استبداله ببايت فارغ لإنهاء الرمز المميز الحالي ، و strtok() يخزن المؤشر إلى البايت التالي ؛ سيتم استخدام هذا المؤشر كنقطة بداية عند البحث عن الرمز المميز التالي. في هذه الحالة strtok() تُرجع مؤشرًا إلى بداية الرمز المميز الذي تم العثور عليه.

من الوصف أعلاه ، يترتب على ذلك أن تسلسل من وحدتي بايت أو أكثر من وحدات البايت المتجاورة في السطر الممسوح ضوئيًا يتم حسابها كمحدد واحد ، ويتم تجاهل وحدات البايت المحددة في بداية السطر أو نهايته. بمعنى آخر ، عادت الرموز المميزة strtok() هي أسطر غير فارغة دائمًا. هذا ، على سبيل المثال ، إذا كان هناك سطر " aaa ؛؛ bbb ،"، ثم المكالمات اللاحقة strtok() مع فواصل الأسطر المحددة " ;, "هل تعيد الخطوط" أأ" و " ب ب"متبوعًا بمؤشر فارغ.

دور strtok_r() هو الإصدار العائد strtok(). جدال سافيبترهو مؤشر لمتغير فحم *الذي يستخدم داخليا strtok_r() لوضع السياق في الاعتبار بين الاستدعاءات اللاحقة عند تحليل نفس السلسلة.

عند الاتصال الأول strtok_r() المعنى شارعيجب أن يشير إلى السلسلة المراد تحليلها والقيمة سافيبترتجاهله. في المكالمات اللاحقة ، القيمة شارعيجب أن يكون NULL والقيمة سافيبترلا ينبغي أن يتغير منذ المكالمة السابقة.

يمكن تحليل السلاسل المختلفة في نفس الوقت مع عمليات تشغيل متعددة strtok_r() بحجج مختلفة سافيبتر.

قيمة الإرجاع

المهام strtok() و strtok_r() إرجاع المؤشر إلى الرمز المميز التالي ، أو NULL إذا لم يكن هناك المزيد من الرموز المميزة.

صفات

للحصول على وصف للمصطلحات في هذا القسم ، انظر صفات(7).
واجهه المستخدم يصف المعنى
strtok() الإضرار في الخيوطغير آمن (MT- سباق غير آمن: strtok)
strtok_r() الإضرار في الخيوطغير مؤذية (MT- الآمن)

امتثال

strtok() POSIX.1-2001 ، POSIX.1-2008 ، C89 ، C99 ، SVr4 ، 4.3BSD. strtok_r() POSIX.1-2001 ، POSIX.1-2008.

عيوب

استخدم هذه الوظائف بعناية. لاحظ أن: * هذه الدالات تعدل وسيطتها الأولى. * لا يمكن استخدام هذه الوظائف مع سلاسل ثابتة. * تم فقد هوية بايت المحدد. * عند الاعراب وظيفة strtok() يستخدم مخزنًا مؤقتًا ثابتًا ، لذا فهو ليس مؤشر ترابط آمن. يستخدم strtok_r() في هذه الحالة.

مثال

يستخدم البرنامج أدناه حلقات متداخلة تستدعي strtok_r() لتقسيم السلسلة إلى الرموز المكونة لها. في المعلمة الأولى سطر الأوامريتم تحديد السلسلة التي تم تحليلها. تحدد المعلمة الثانية البايت (البايتات) - الفاصل المستخدم لتقسيم السلسلة إلى رموز "مركبة". تحدد المعلمة الثالثة البايت (البايت) - الفاصل المستخدم لفصل الرموز المميزة "المركبة" إلى رموز فرعية.

مثال على مخرجات البرنامج:

$./a.out "a / bbb /// cc؛ xxx: yyy:" ":؛" "/" 1: a / bbb /// cc -> a -> bbb -> cc 2: xxx -> xxx 3: yyy -> yyy

كود المصدر للبرنامج

#تضمن #تضمن #تضمن int main (int argc، char * argv) (char * str1، * str2، * token، * subtoken؛ char * saveptr1، * saveptr2؛ int j؛ if (argc! = 4) (fprintf (stderr، "Usage:٪ s string delim subdelim \ n "، argv)؛ exit (EXIT_FAILURE) ؛) لـ (j = 1، str1 = argv ؛؛ j ++، str1 = NULL) (الرمز المميز = strtok_r (str1، argv، & saveptr1) ؛ إذا (الرمز = = NULL) كسر ؛ printf ("٪ d:٪ s \ n"، j، token) ؛ لـ (str2 = token ؛؛ str2 = NULL) (subtoken = strtok_r (str2، argv، & saveptr2) ؛ إذا (suboken == NULL) break؛ printf ("->٪ s \ n"، subtoken) ؛)) خروج (EXIT_SUCCESS) ؛)

مثال آخر على برنامج يستخدم strtok() يمكن العثور عليها في getaddrinfo_a(3).

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

في لغة البرمجة C ، يتم التصريح عن وظائف العمل مع السلاسل في الملف الاساسي string.h ، والتي يجب أن تتذكر تضمينها في شفرة المصدر الخاصة بك. هناك حوالي عشرين دالة للعمل مع السلاسل. من بينها هناك من يبحث عن الأحرف في سلسلة ، ويقارن الوظائف ، وينسخ السلاسل ، وأيضًا أكثر تحديدًا. قائمة ووصف لمعظم القائمة هذه اللحظةفي وظائف لغة C يمكن العثور عليها في ملحق كتاب ب. Kernighan ، D. Ritchie "لغة البرمجة C ، الإصدار الثاني".

يمكن لجميع الوظائف المعلنة في string.h أثناء عملهم تغيير أو عدم تغيير أحد السلاسل التي يمررها المؤشر. يعتمد ذلك على الغرض من الوظيفة. ومع ذلك ، فإن معظمهم يعيد شيئًا: إما مؤشر إلى حرف أو عدد صحيح. علاوة على ذلك ، إذا غيرت دالة أحد معاملاتها وتم استدعاؤها لهذا الغرض ، فيمكن تجاهل ما تعيده (أي لم يتم تعيينها لأي شيء في وظيفة الاستدعاء).

على سبيل المثال ، الدالة strcpy () لها هذا التصريح: char * strcpy (char *، const char *). يقوم بنسخ السلسلة التي يشير إليها المعلمة الثانية إلى السلسلة التي يشير إليها المعلمة الأولى. وبالتالي ، يتم تغيير المعلمة الأولى. بالإضافة إلى ذلك ، تقوم الوظيفة بإرجاع مؤشر إلى الحرف الأول من السلسلة:

char s1 [10] ، s2 [10] ؛ شار * s3 ؛ s3 = s2 ؛ يحصل (s1) ؛ s3 = strcpy (s2، s1) ؛ يضع (s2) ؛ يضع (s3) ؛ printf ("٪ p،٪ p \ ن "، s2 ، s3) ؛

هنا يشير s2 و s3 إلى نفس الحرف (printf () يطبع نفس العناوين). ومع ذلك ، لا يمكن تعيين إرجاع strcpy () إلى مصفوفة. لا يتم عادةً تعيين نتيجة هذه الوظيفة لأي شيء ؛ في بعض الأحيان يكفي أن يغير ببساطة أحد الخطوط التي يمر بها المؤشر.

شيء آخر هو الدوال مثل strlen () أو strcmp () ، والتي لا تغير المعلمات ، ولكن يتم استدعاؤها من أجل النتيجة. تقارن الدالة strcmp () بين سلسلتي وسيطة حرفًا بحرف (معجميًا) وتعيد 0 ، -1 ، أو 1. على سبيل المثال ، استدعاء strcmp ("boy" ، "body") سيعيد 1 ، منذ ذلك الحين رمز الحرف "y" أكبر من الحرف "d". استدعاء strcmp ("body"، "boy") سيعود -1 ، منذ ذلك الحين الحجة الأولى أقل من الثانية من ناحية المعجم.

دالة Strtok ()

باستخدام وظيفة strtok () ، يمكنك تقسيم سلسلة إلى أجزاء منفصلة (الرموز). يبدو إعلان هذه الوظيفة كما يلي: char * strtok (char *، const char *). عندما يتم استدعاء الوظيفة لأول مرة ، يتم تحديد السلسلة المراد تقسيمها كمعامل أول. المعلمة الثانية هي السلسلة الفاصلة. في الاستدعاءات اللاحقة للدالة لنفس السلسلة ، يجب أن يكون المعامل الأول NULL ، منذ ذلك الحين الوظيفة "تذكرت" بالفعل ما تعمل معه. لنفكر في مثال:

char str = "واحد ، اثنان ، ثلاثة ، أربعة ، خمسة" ؛ شار * س ؛ sp = strtok (str، "،") ؛ while (sp) (puts (sp) ؛ sp = strtok (NULL، "،") ؛)

نتيجة لتنفيذ هذا الرمز ، يتم عرض الكلمات في عمود على الشاشة:

واحد إثنان ثلاثة أربعة خمسة

عند الاستدعاء الأول لـ strtok () ، يتم تمرير مؤشر إلى الحرف الأول من المصفوفة وسلسلة فاصلة إلى الوظيفة. بعد هذا الاستدعاء ، يتم تغيير مصفوفة str ، وتبقى كلمة "one" فقط فيها ، وتقوم الوظيفة أيضًا بإرجاع مؤشر لهذه الكلمة ، التي تم تعيينها لـ sp.

على الرغم من أننا فقدنا بقية المصفوفة في دالة الاستدعاء ، يتم تخزين مؤشر لبقية المصفوفة داخل strtok (). عندما يتم تمرير NULL ، فإن الوظيفة "تعرف" للعمل مع هذا الذيل.

نسخ أجزاء من السطور

عندما تحتاج فقط إلى ربط سلسلتين ، يمكن حل المشكلة بسهولة عن طريق استدعاء دالة strcat () ، التي تلحق الثانية بنهاية الوسيطة الأولى. تقوم وظيفة مماثلة strncat () بربط الأحرف n من السطر الثاني إلى الأول. تم تحديد n كمعامل ثالث.

ماذا لو كان الوضع أكثر صعوبة؟ على سبيل المثال ، هناك سطرين غير فارغين وتحتاج إلى توصيل بداية الأول ونهاية الثاني. يمكن القيام بذلك باستخدام الدالة strcpy () ، إذا قمت بتمرير مراجع إلى غير الأحرف الأولى من السلاسل:

char s1 [20] = "Peter Smith"، s2 = "Julia Roberts"؛ strcpy (s1 + 5 ، s2 + 5) ؛ يضع (s1) ؛

في هذه الحالة ، ستعرض الشاشة "Peter Roberts". لماذا حصل هذا؟ تم تمرير مؤشر إلى الحرف السادس من السطر الأول إلى الدالة strcpy (). أدى ذلك إلى حقيقة أنه عند النسخ ، يتم الكتابة فوق أحرف هذا السطر فقط بدءًا من السادس ، منذ ذلك الحين لا يعرف strcpy () أي شيء عن الأحرف السابقة. يتم أيضًا تمرير جزء فقط من السلسلة كوسيطة ثانية ، والتي يتم نسخها في الأولى.

كيف أقوم بإدخال سطر في وسط الآخر؟ يمكنك حل هذه المشكلة باستخدام خط "عازلة" ثالث ، حيث يمكنك أولاً نسخ السطر الأول ، ثم السطر الثاني ، والكتابة فوق نهاية السطر الأول ، ثم إلحاق نهاية السطر الأول. ولكن يمكنك أيضًا القيام بذلك:

char s1 [20] = "واحد ثلاثة" ، s2 [20] = "اثنان" ؛ strcpy (s2 + 3 ، s1 + 3) ؛ strcpy (s1 + 4 ، s2) ؛ يضع (s1) ؛

هنا ، أولاً ، يتم نسخ نهاية الأول في السطر الثاني ، مما ينتج عنه "اثنان ثلاثة". ثم يتم نسخ الثاني إلى السطر الأول ، متجاوزًا بدايته.

وصف لبعض الوظائف للعمل مع السلاسل

ممارسه الرياضه
فيما يلي وصف لبعض الوظائف التي تؤدي عمليات على السلاسل. تصميم وكتابة برامج صغيرة توضح كيفية عمل هذه الوظائف.

  • char * strchr (const char *، int c). إرجاع مؤشر إلى التواجد الأول لـ c في سلسلة. ترجع القيمة NULL إذا لم يكن هناك مثل هذا الحرف في السلسلة.
  • char * strstr (const char * s2، const char * s1). إرجاع مؤشر إلى التواجد الأول للسلسلة s1 في السلسلة s2. ترجع NULL إذا لم يكن هناك تطابق.
  • char * strncpy (char *، const char *، size_t n). ينسخ n من الأحرف من السطر الثاني إلى الأول.
  • size_t strspn (const char *، const char *). لعرض طول بداية السطر الأول ، والذي يتضمن الأحرف التي يتكون منها السطر الثاني.

بناء الجملة:

#تضمن
char * strtok (char * str، const char * sep) ؛

الحجج:

str هو مؤشر على السلسلة المراد تقسيمها.
sep هو مؤشر لسلسلة تحتوي على مجموعة من الأحرف الفاصلة.

القيمة المعادة:

NULL - إذا تعذر تقسيم سلسلة السلسلة إلى أجزاء.
المؤشر إلى الحرف الأول من الجزء المحدد من السلسلة.

وصف:

تحدد وظيفة strtok الجزء التالي من السلسلة المشار إليها بواسطة وسيطة str ، مفصولة بأحد الأحرف الفاصلة المحددة في السلسلة المشار إليها بواسطة الوسيطة sep. ينتج عن استدعاء تسلسلي لوظيفة strtok تقسيم سلسلة السلسلة إلى أجزاء (الرموز).

"الاستدعاء الأول لوظيفة strtok يحدد بداية السلسلة المنفصلة (str) وبداية السلسلة التي تحتوي على فواصل (sep). أولاً ، تتكرر وظيفة strtok عبر الأحرف في str وتبحث عن حرف غير موجود في سلسلة فاصل sep. إذا تمت مصادفة حرف نهاية السطر في str قبل العثور على حرف غير مدرج في sep ، فلا يمكن تقسيم str إلى أجزاء ويتم إرجاع مؤشر فارغ (NULL). إذا تم العثور على مثل هذا الحرف ، فإنه يعتبر بداية الجزء الأول من سلسلة السلسلة. "

بعد ذلك ، تبحث وظيفة strtok عن الفاصل ، أي الحرف المتضمن في سلسلة sep. إذا لم يتم العثور على مثل هذا الحرف ، فسيتم اعتبار أن سلسلة السلسلة تتكون من جزء واحد وأن التقسيم اللاحق لسلسلة السلسلة str سيعيد مؤشرًا فارغًا. إذا تم العثور على مثل هذا الرمز. ثم يتم استبداله بحرف فارغ (حرف نهاية السطر). بعد ذلك ، تتذكر وظيفة strtok الموضع الحالي (مؤشر إلى الحرف الذي سيبدأ منه البحث عن الجزء التالي من السلسلة) وتعيد مؤشرًا إلى بداية الجزء الأول المحدد من السلسلة.

إذا أعادت الدالة strtok مؤشرًا غير فارغ ، فيمكنك متابعة تقسيم str إلى أجزاء. لمواصلة تقسيم السلسلة ، يتم استدعاء وظيفة strtok مرة أخرى ، ولكن بدلاً من مؤشر السلسلة المراد تقسيمها ، يتم تحديد NULL كأول زيادة. في هذه الحالة ، ستستمر وظيفة strtok في الانفصال عن العنوان الذي تم تذكره. تظل خوارزمية التقسيم كما هي.

مثال:

في المثال ، يتم تقسيم السلسلة "test1 / test2 / test3 / test4" إلى أجزاء بواسطة الفاصل "/" باستخدام وظيفة strtok. يتم إخراج نتيجة التقسيم إلى وحدة التحكم.

نتيجة:

إخراج وحدة التحكم:


char far * far _fstrtok (const char far * str1، const char far * str2)

وصف:

ترجع الدالة strtok () مؤشرًا إلى الرمز المميز التالي في السلسلة التي يشير إليها str1. تُستخدم الأحرف من السلسلة المشار إليها بواسطة str2 كمحددات لتحديد الرمز المميز. إذا لم يتم العثور على الرمز المميز ، يتم إرجاع NULL.

يستخدم الاستدعاء الأول لـ strtok () في الواقع str1 كمؤشر. تستخدم المكالمات اللاحقة NULL كوسيطة أولى. وبالتالي ، يمكن ترميز الخط بأكمله.

من المهم أن نفهم أن الدالة strtok () تعدل السلسلة التي يشير إليها str1. في كل مرة يتم العثور على رمز مميز ، يتم وضع حرف فارغ حيث تم العثور على المحدد. بهذه الطريقة يتم تقديم strtok () على طول الخط.

في كل مرة تقوم فيها باستدعاء strtok () ، يمكنك تغيير مجموعة المحددات.

وظيفة _fstrtok () هي نسخة FAR من الوظيفة المعنية.

يقوم البرنامج التالي بتقسيم السلسلة النصية "الجندي الصيفي ، الشمس المشرقة الوطني" إلى رموز ، باستخدام المسافات والفواصل كمحددات. نتيجة لعملية البرنامج ، سيتم إنشاء سطر من النموذج التالي: “The | الصيف | جندي | في | أشعة الشمس | باتريوت ".
#تضمن
#تضمن
int main (باطل)
{
شار * ع ؛
ع = strtok ( "جندي الصيف ، وطن الشمس المشرقة", " " ) ;
printf (ع) ؛
فعل (
p = strtok (" \0 " , ", " ) ;
إذا (p) printf ("|٪ s" ، p) ؛
) بينما (ع) ؛
العودة 0 ؛
}