سؤال

أحاول التنفيذ

void strcpyy(char *s, char *t){
    while(*s++ = *t++){
    }
}

وهو مثال من K&R.يجب أن يكون التنفيذ سهلاً إلى حد ما ولكن لسبب ما، ليس هذا هو الحال بالنسبة لي في الوقت الحالي.لذلك لدي ما يلي

int main(){
    char *mess = "hello world";
    char *mess = (char *) malloc(strlen(mess) + 1);
    char *aess;

    strcpyy(aess, mess);

    printf("%s", aess);

    return 0;
}

في كل مرة أقوم بتشغيل البرنامج، أستمر في الحصول على قائمة كبيرة من الأخطاء في كل مرة أقوم فيها بتشغيل البرنامج -Wall.أعتقد أن التنفيذ والاستخدام strcpyy, ، سيتعين عليك تخصيص مساحة لنسخ السلسلة وبمجرد القيام بذلك، يجب أن تكون قادرًا على الطباعة aess والتي من الناحية النظرية يجب أن تحتوي على نسخة من mess.أي مساعدة سيكون محل تقدير كبير!

هل كانت مفيدة؟

المحلول

من الممارسات الجيدة دائمًا الانتباه إلى رسائل الخطأ، خاصة الرسالة الأولى (غالبًا ما تكون الرسائل الأخرى نتيجة للخطأ الأول).من المؤكد أن رسالة الخطأ أشارت إلى رقم السطر المطابق للسطر الذي يحتوي على malloc، وعلى الأرجح أخبرتك ما هي المشكلة هناك.

صحح برنامجك ليقرأ:

char *mess = "hello world";
char *aess = (char *) malloc(strlen(mess) + 1);

أو الوظيفة الكاملة هي:

int main(){
    char *mess = "hello world";
    char *aess = (char *) malloc(strlen(mess) + 1);

    strcpyy(aess, mess);

    printf("%s", aess);

    return 0;
}

المشكلة هي أن خطك

char *mess = (char *) malloc(strlen(mess) + 1);

الكتابة فوق السطر الأول

char *mess = "hello world";

والخط

char *aess;

يترك المتغير غير معين.

خطأ الترجمة هو أن المترجم لا يمكنه الاختيار بين

char *mess = "hello world";

و

char *mess = (char *) malloc(strlen(mess) + 1);

والتي تقدم متغيرًا جديدًا ولكن بنفس الاسم.

نصائح أخرى

سيبدو البرنامج بالشكل التالي

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

void strcpyy( char *s, const char *t )
{
    while ( *s++ = *t++ );
}

int main( void )
{
    char *t = "hello world";
    char *s = ( char * )malloc( strlen( t ) + 1 );

    strcpyy( s, t );

    printf( "%s\n", s );

    free( s );

    return 0;
}

يتغير

char *mess = "hello world";
char *mess = (char *) malloc(strlen(mess) + 1);
char *aess;

ل

char *mess = "hello world";
char *aess = malloc(strlen(mess) + 1);

mess هي سلسلة حرفية، والتي يتم الاحتفاظ بها في ذاكرة القراءة فقط.كنت تقوم بالكتابة فوقه وتفقد السلسلة التي تريد نسخها.تحتاج إلى تخصيص بعض المساحة للمكان الذي تريد نسخ الأحرف فيه، في حالتك aess عامل.تذكر أيضًا أن free(aess); في نهاية برنامجكإذا لم يكن الأمر كذلك، فسوف تحصل على تسرب الذاكرة.

لماذا تعلن وتحدد mess مرتين؟لا تعلن مطلقًا عن متغيرين يحملان نفس الاسم إذا كان لهما نفس النطاق، وبذلك فإنك تربك المترجم؛أنا أوصي باستخدام strdup مثله :

int main(){
char *mess = strdup("hello world");
char *aess;

strcpyy(aess, mess);

printf("%s", aess);

return 0;

}

أو مجرد مجموعة عادية مثل هذا

int main(){

char mess[] = "hello world";
char *aess;

strcpyy(aess, mess);

printf("%s", aess);

return 0;

}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top