سؤال عن صحة كود برمجي بلغة السي

السلام عليكم, إخوتي لماذا لا لايعمل الكود التالي مع أنه لاتظهر أية أخطاء أثناء تفسيره من قبل المفسّر!!, و هو كود لنسخ سلسلة معينة و استبدالها بأخرى سابقة باستخدام المؤشرات:

   #include<stdio.h>
   char* mystrcpy (char* destination, char* source)
 {
       char* res = destination;
       while(*source != '\0')
      {
         *destination = *source;
         destination++;
         source++;
             }
            return res; 
            }
       int main()
        {
           char* a = "ACER";
           char* b = "HP";
           printf("%s", a);
           printf("\n\n%s", mystrcpy(a, b) );

           return 0;
         }
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

لماذا لا لايعمل الكود التالي مع أنه لاتظهر أية أخطاء أثناء تفسيره من قبل المفسّر!!

البرنامج يُسمى مترجم Compiler لا مفسر Interpreter

سبب المشكلة أنك تحاول الكتابة على ذاكرة للقراءة فقط

char* a = "ACER";

أكتب هذا مكانه

char* a = malloc(sizeof(char) * 10);

هذه المشكلة حلت في ++C بإنشائهم صنف Std::String

اقرأ كتاب الإكسير

سيساعدك على فهم المؤشرات

المشكلة مازالت !!!

ماذا عن هذا؟

#include <stdio.h>
#include <stdlib.h>

char* mystrcpy (char* destination, char* source)
{
    int i=0;
    char* res = destination;

    while(source[i] != '\0')
    {
        destination[i] = source[i];
        i++;
    }
    destination[i]=0;

    return res;
}

int main()
{
    char* a = malloc(sizeof(char) * 10);
    char* b = "HP";
    printf("\n\n%s", mystrcpy(a, b) );

    return 0;
}

بعد التخلص من الكود الزائد واستخدام المدخلات مباشرة

#include <stdio.h>
#include <stdlib.h>

void mystrcpy(char * dest,char *src)
{
    while(*src!=0)
        *dest++=*src++;
    *dest=0;
}

int main()
{
    char* a =(char *) malloc(sizeof(char) * 10);
    char* b = "HP";
    mystrcpy(a,b);
    printf("%s", a);

    return 0;
}

هذه سلاسل حروف وليست أعداد

}

    destination++;
    source++;

{

هذا مؤشرات وليس سلاسل حرفية!

james234 أضف ردا

الكود يهدف إلى تنفيذ دالة mystrcpy التي تحاكي وظيفة strcpy في لغة C، أي نسخ سلسلة نصية من مصدر (source) إلى وجهة (destination). ثم يقوم البرنامج بطباعة السلسلة النصية الأصلية (a)، وبعد ذلك يطبع نتيجة استدعاء الدالة mystrcpy مع تمرير a و b كمعاملات.

المشاكل المحتملة:

الكتابة فوق سلسلة نصية ثابتة: السلسلة النصية "ACER" معرّفة كسلسلة نصية ثابتة (string literal)، مما يعني أنها مخزنة في منطقة ذاكرة للقراءة فقط. محاولة الكتابة فوق هذه المنطقة باستخدام mystrcpy سيؤدي إلى سلوك غير محدد، وغالبًا إلى حدوث خطأ في وقت التشغيل (runtime error) أو تعطل البرنامج.

عدم تخصيص مساحة كافية للوجهة: السلسلة النصية "HP" أقصر من "ACER"، ولكن mystrcpy لن يضيف حرف إنهاء السلسلة (\0) في نهاية السلسلة المنسوخة، مما قد يؤدي إلى قراءة بيانات غير مرغوب فيها عند طباعة السلسلة المنسوخة.

طباعة مكررة: السطر printf("%s", a); سيطبع كلمة "ACER" والسطر printf("\n\n%s", mystrcpy(a, b) ); سيحاول طباعة كلمة "HP" في "ACER" في نفس مكان الذاكرة.

تصحيح الكود:

لتصحيح هذه المشاكل، يجب عليك تخصيص مساحة كافية للوجهة باستخدام مصفوفة حروف (character array) بدلاً من سلسلة نصية ثابتة. بالإضافة إلى ذلك، يجب عليك إضافة حرف إنهاء السلسلة (\0) في نهاية السلسلة المنسوخة.