الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]استفسار عن سطر بلغة C

بدأه علاء السلال في 7 يونيو 2008 · 8 رد · 1,035 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

االسلام عليكم ،

أرجو تفسير هذا السطر البرمجي بلغة C لي ،

while (*s++ = *t++);

وشكراً مقدماً

:)

اللهم طهر أرض فلسطين من العملاء والخونة

#2

يظهر انه نسخ بدون توقف غير مشروط

tvquran_6.gif

#3

السلام عليكم ..

while (*s++ = *t++);

هذا السطر البرمجي من روائع السي :) , فهو يقوم , بعملية نسخ سلسله حرفية الى اخرى ..

فكما هو معروف , السلاسل الحرفية في السي , ماهي الا عباره عن اماكن متجاوره في الذاكرة (مصفوفة) منتهيه برمز يدعى Null Character او '\0' والذي يحدد نهاية السلسله

مثلاً , اذا عرفت متغير رمزي بالشكل

 char *t="Hello";

فإن التخزين في الذاكرة سيكون على الشكل

H-e-l-l-o-\0 , حيث يدل الـ Null Char على نهاية السلسة , بحيث تميز دوال النصوص او دوال الطباعة مثل printf نهاية السلسلة .

الان , لو اردت ان تنسخ سلسله , الى متغير اخر , يجب عليك ان تقوم بتعبئة مصفوفة المتغير الجديد , بمحتويات المتغير txt الى ان تصل الى الرمز Null string .

اذاً عباره المساواه

*s++ = *t++

تقوم باولاً مساواه الخانات , من خلال الخانه الاولى من s بالخانه الاولى من t , وبعد ذلك تتم الزيادة عن طريق ++ , ويتم تكرار العملية بواسطه while والتي ستكرر العملية

الى ان يصل الى اللحظه التي يتم فيها مساواة اخر خانه من s بإخر خانه من t والتي تحتوي على رمز Null Char والذي يتعبر بمثابة false الذي يقوم بإنهاء الحلقة ..

للتوضيح اكثر , السطر الذي ذكرته يمكن إعاده كتابته بعده طرق , مثلاً عن طريق استخدام المصفوفات (على فرض وجود متغيرين s و t) :

int i=0;
while (s != '\0') {
	s=t;
	i++;
}

طبعاً ممكن ايضاً ان تختصر الكود السابق الى

int i=0;
while ((s=t) != '\0')
	i++;

وعن طريق استخدام المؤشرات , تستطيع كتابة الكود :

while (*s != '\0') {
	*s=*t;
	s++;
	t++;
}

لاحظ هنا ان t++ , معناها زيادة المؤشر ليقوم بالتأشير على البلوك(البايت في حاله السلسله) التالي في الذاكرة . ويمكن ان تختصر الكود السابق الى :

while (*s++ = *t++);

وهو السطر الذي وضعته ..

ارجو ان تكون الصورة قد وضحت ..

تم تعديل هذه المشاركة بواسطة محمد معاشر في 8 يونيو 2008 في 00:16 — السبب: خطأ مطبعي ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#4

يا سلام :)

شكراً على الشرح الوافي أخي محمد ،

الله يخليلنا المكتبة String في C++ :lol:

اللهم طهر أرض فلسطين من العملاء والخونة

#5

رائع ... معلومة جديدة ورائعة ... لكن باستطاعتنا نسخها بواسطة مكتبة الـ String أليس كذلك أخ محمد؟

#6

string.h

char *strcpy( char *strDestination, const char *strSource );

API

LPTSTR lstrcpy(

	LPTSTR lpString1,	// address of buffer 
	LPCTSTR lpString2 	// address of string to copy 
   );

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

شكراً أخي الكريم بالفعل كنت بحاجة لمراجعة معلوماتي بالسي !!

#8
خالد_الحوراني كتب:
رائع ... معلومة جديدة ورائعة ... لكن باستطاعتنا نسخها بواسطة مكتبة الـ String أليس كذلك أخ محمد؟

الاخ GM قام بالواجب . واحب ان اضيف ان داله strcpy , منفذه بذلك السطر ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#9

شكراً أخ محمد على التوضيح العميق ...

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…