االسلام عليكم ،
أرجو تفسير هذا السطر البرمجي بلغة C لي ،
while (*s++ = *t++);
وشكراً مقدماً
:)
السلام عليكم ..
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 — السبب: خطأ مطبعي ..
رائع ... معلومة جديدة ورائعة ... لكن باستطاعتنا نسخها بواسطة مكتبة الـ String أليس كذلك أخ محمد؟
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]
شكراً أخي الكريم بالفعل كنت بحاجة لمراجعة معلوماتي بالسي !!
خالد_الحوراني كتب:رائع ... معلومة جديدة ورائعة ... لكن باستطاعتنا نسخها بواسطة مكتبة الـ String أليس كذلك أخ محمد؟
الاخ GM قام بالواجب . واحب ان اضيف ان داله strcpy , منفذه بذلك السطر ..
شكراً أخ محمد على التوضيح العميق ...
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…