كيفية استخدام Strcpy () في لغة C؟

How Use Strcpy C Language



في هذه المقالة ، سنتعرف على وظيفة strcpy () في لغة البرمجة C. وظيفة strcpy () هي وظيفة مكتبة قياسية شائعة جدًا لأداء عملية نسخ السلسلة في لغة البرمجة C. هناك العديد من ملفات الرؤوس القياسية بلغة البرمجة C لأداء العمليات القياسية. تعد string.h أحد ملفات الرأس هذه ، والتي توفر العديد من وظائف المكتبة القياسية لأداء عمليات السلسلة. وظيفة strcpy () هي إحدى وظائف المكتبة التي توفرها string.h.

بناء الجملة:

شار* سترسبي (شار*موقع وجهةو مقدار ثابت شار*مصدر_السلسلة)؛

فهم strcpy ():

الغرض الوحيد من وظيفة strcpy () هو نسخ سلسلة من المصدر إلى الوجهة. الآن ، دعونا نلقي نظرة على بناء الجملة أعلاه لوظيفة strcpy (). الدالة strcpy () قادرة على قبول معلمتين -







  • شار * الوجهة
  • كونست شار * مصدر

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



النقطة المهمة التي يجب ملاحظتها هنا هي أن الدالة strcpy () لا تلحق السلسلة المصدر بسلسلة الوجهة. بل يستبدل محتوى الوجهة بمحتوى سلسلة المصدر.



أيضًا ، لا تقوم وظيفة strcpy () بإجراء أي فحوصات للتأكد من أن حجم الوجهة أكبر من سلسلة المصدر ، فهي مسؤولية المبرمج تمامًا.





أمثلة:

الآن ، سنرى عدة أمثلة لفهم وظيفة strcpy ():

  1. strcpy () - عملية عادية (example1.c)
  2. strcpy () - حالة -1 (example2.c)
  3. strcpy () - حالة -2 (example3.c)
  4. strcpy () - حالة -3 (example4.c)
  5. strcpy () - إصدار محدد من قبل المستخدم (example5.c)
  6. strcpy () - إصدار مُحسَّن من قِبل المستخدم (example6.c)

strcpy () - عملية عادية (example1.c):

يوضح هذا المثال البرنامج كيفية تنفيذ عملية نسخ سلسلة عادية باستخدام وظيفة strcpy () في لغة البرمجة C. يرجى ملاحظة أن طول سلسلة الوجهة هو 30 (char destination_str [30] ؛) ، وهو أكبر من طول سلسلة المصدر (الطول 18 بما في ذلك الحرف NULL) بحيث يمكن للوجهة استيعاب جميع الأحرف من سلسلة المصدر.



#يشمل
#يشمل

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛
شارالوجهة_str[30]؛

printf (قبل استدعاء دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

سترسبي (الوجهة_strوالمصدر_str)؛

printf (بعد تنفيذ دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

إرجاع 0؛
}

strcpy () - حالة -1 (example2.c):

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

  1. لن تتحقق الدالة strcpy () مما إذا كانت الوجهة بها مساحة كافية.
  2. قد يكون هذا خطيرًا في البرامج المضمنة لأن strcpy () سيحل محل منطقة الذاكرة خارج حدود الوجهة.

دعونا نلقي نظرة على مثال البرنامج. لقد أعلنا عن source_str وقمنا بتهيئته إلى www.linuxhint.com ، والتي ستستغرق 18 بايت في الذاكرة للتخزين ، بما في ذلك الحرف Null في نهاية السلسلة. بعد ذلك ، أعلنا عن مصفوفة أحرف أخرى ، أي ، destination_str بحجم 5. فقط ، لذلك ، لا يمكن أن يحتفظ التابع destination_str بسلسلة المصدر بإجمالي حجم 18 بايت.

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

في هذا المثال ، يمكننا أن نرى من الإخراج أدناه ، أن دالة strcpy () تحل محل سلسلة المصدر نفسها. يجب على المبرمجين توخي الحذر دائمًا مع مثل هذا السلوك.

#يشمل
#يشمل

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛
شارالوجهة_str[5]؛

printf (قبل استدعاء دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

سترسبي (الوجهة_strوالمصدر_str)؛

printf (بعد تنفيذ دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

// printf ('Source Address =٪ u (0x٪ x) n'، & source_str [0]، & source_str [0])؛
// printf ('Destination Address =٪ u (0x٪ x) n'، & destination_str [0]، & destination_str [0])؛

إرجاع 0؛
}

strcpy () - حالة -2 (example3.c):

يوضح هذا البرنامج الموقف عندما يكون حجم سلسلة الوجهة أكبر من حجم سلسلة المصدر ويتم بالفعل تهيئة سلسلة الوجهة ببعض القيمة. في هذا المثال ، قمنا بتهيئة:

  • source_str ل www.linuxhint.com [الحجم = 17 + 1 = 18]
  • destination_str إلى I_AM_A_DESTINATION_STRING [الحجم = 25 + 1 = 26]

ستنسخ الدالة strcpy () جميع الأحرف الـ 17 والحرف NULL من السلسلة المصدر إلى السلسلة الوجهة. ولكن ، لن تحل محل / تغير البايتات المتبقية (بايت 19 إلى 26 ، مستند إلى واحد) في الصفيف الوجهة. لقد استخدمنا حلقة for للتكرار على المصفوفة الوجهة وطباعة المصفوفة بأكملها لإثبات أن البايتات -19 إلى 26 لم تتغير في المصفوفة الوجهة. هذا هو السبب في أننا نرى الناتج الأخير على النحو التالي:

www.linuxhint.com_STRING .

#يشمل
#يشمل


/ * يوضح هذا البرنامج الموقف عندما:

حجم سلسلة الوجهة> حجم سلسلة المصدر

ونقوم بتنفيذ وظيفة strcpy () لنسخ ملف
سلسلة المصدر إلى الوجهة.

ملاحظة: يجب أن يكون حجم سلسلة الوجهة دائمًا
تكون أكبر من سلسلة المصدر أو مساوية لها.
* /

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛
شارالوجهة_str[26] = 'I_AM_A_DESTINATION_STRING'؛

printf (قبل استدعاء دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

سترسبي (الوجهة_strوالمصدر_str)؛

printf (بعد تنفيذ دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛


/ * طباعة سلسلة الوجهة باستخدام حلقة for * /
printf (اطبع سلسلة الوجهة char بواسطة char:نن')؛
printf (' tسلسلة الوجهة = ')؛

ل(intأنا=0؛أنا<25؛أنا++)
{
printf ('٪ ج'والوجهة_str[أنا])؛
}
printf ('نن')؛

إرجاع 0؛
}

strcpy () - حالة -3 (example4.c):

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

#يشمل
#يشمل

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛

printf (قبل استدعاء دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛

/ * لا تستدعي strcpy () مع سلسلة حرفية كوجهة.
البرنامج سوف يتعطل.
* /

سترسبي ('الوجهة_ستر'والمصدر_str)؛

printf (بعد تنفيذ دالة strcpy ():نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛

إرجاع 0؛
}

strcpy () - إصدار محدد من قبل المستخدم (example5.c):

في هذا المثال البرنامج ، أظهرنا كيفية كتابة نسخة محددة من قبل المستخدم من وظيفة strcpy ().

#يشمل
شار *strcpy_user_defined(شار *مصيرو مقدار ثابت شار *src)؛

/ * نسخة محددة من قبل المستخدم لوظيفة strcpy () * /
شار *strcpy_user_defined(شار *مصيرو مقدار ثابت شار *src)
{
شار *dest_backup=مصير؛

في حين(*src! = ' 0') / * كرر حتى يتم العثور على ' 0'. * /
{
*مصير= *src؛ / * نسخ حرف المصدر إلى الوجهة * /
src++ ؛ / * مؤشر مصدر الزيادة * /
مصير++ ؛ / * زيادة مؤشر الوجهة * /
}

*مصير= ' 0'؛ / * أدخل ' 0' في الوجهة بشكل صريح * /

إرجاعdest_backup؛
}

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛
شارالوجهة_str[30]؛

printf (قبل استدعاء وظيفة نسخ السلسلة المعرفة من قبل المستخدم:نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

/ * استدعاء وظيفة نسخ السلسلة المعرفة من قبل المستخدم * /
strcpy_user_defined(الوجهة_strوالمصدر_str)؛

printf (بعد تنفيذ وظيفة نسخ السلسلة المحددة من قبل المستخدم:نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

إرجاع 0؛
}

strcpy () - إصدار مُحسَّن من قِبل المستخدم (example6.c):

الآن ، في مثال البرنامج هذا ، سنقوم بتحسين الإصدار المعرف من قبل المستخدم من strcpy ().

#يشمل
شار *strcpy_user_defined(شار *مصيرو مقدار ثابت شار *src)؛


/ * الإصدار الأمثل لوظيفة strcpy () المعرفة من قبل المستخدم * /
شار *strcpy_user_defined(شار *مصيرو مقدار ثابت شار *src)
{
شار *dest_backup=مصير؛

في حين(*مصير++ = *src++)
؛

إرجاعdest_backup؛
}

intالأساسية()
{
شارالمصدر_str[] = 'www.linuxhint.com'؛
شارالوجهة_str[30]؛

printf (قبل استدعاء وظيفة نسخ السلسلة المعرفة من قبل المستخدم:نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

/ * استدعاء وظيفة نسخ السلسلة المعرفة من قبل المستخدم * /
strcpy_user_defined(الوجهة_strوالمصدر_str)؛

printf (بعد تنفيذ وظيفة نسخ السلسلة المحددة من قبل المستخدم:نن')؛
printf (' tسلسلة المصدر =٪ sن'والمصدر_str)؛
printf (' tسلسلة الوجهة =٪ sنن'والوجهة_str)؛

إرجاع 0؛
}

استنتاج :

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