কিভাবে সি ভাষায় Strcpy () ব্যবহার করবেন?

How Use Strcpy C Language



এই নিবন্ধে, আমরা সি প্রোগ্রামিং ভাষায় strcpy () ফাংশন সম্পর্কে জানতে যাচ্ছি। Strcpy () ফাংশনটি সি প্রোগ্রামিং ভাষায় স্ট্রিং কপি অপারেশন করার জন্য একটি খুব জনপ্রিয় স্ট্যান্ডার্ড লাইব্রেরি ফাংশন। স্ট্যান্ডার্ড অপারেশন করার জন্য সি প্রোগ্রামিং ভাষায় বেশ কয়েকটি স্ট্যান্ডার্ড হেডার ফাইল রয়েছে। String.h হল এই ধরনের হেডার ফাইলগুলির মধ্যে একটি, যা স্ট্রিং অপারেশন সম্পাদনের জন্য বেশ কয়েকটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন প্রদান করে। Strcpy () ফাংশন স্ট্রিং.এইচ দ্বারা প্রদত্ত লাইব্রেরি ফাংশনগুলির মধ্যে একটি।

বাক্য গঠন:

গৃহস্থালি* strcpy (গৃহস্থালি*গন্তব্য_ অবস্থান, const গৃহস্থালি*উৎস_স্ট্রিং);

Strcpy () বোঝা:

Strcpy () ফাংশনের একমাত্র উদ্দেশ্য হল উৎস থেকে গন্তব্যে একটি স্ট্রিং কপি করা। এখন, আসুন strcpy () ফাংশনের উপরের সিনট্যাক্সটি দেখি। Strcpy () ফাংশন দুটি পরামিতি গ্রহণ করতে সক্ষম -







  • char * গন্তব্য
  • const char * উৎস

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 () ফাংশন ব্যবহার করে একটি সাধারণ স্ট্রিং কপি অপারেশন করতে হয়। অনুগ্রহ করে মনে রাখবেন যে গন্তব্য স্ট্রিং এর দৈর্ঘ্য 30 (char destination_str [30];), যা উৎস স্ট্রিং এর দৈর্ঘ্যের চেয়ে বড় (দৈর্ঘ্য 18 টি শূন্য অক্ষর সহ) যাতে গন্তব্যটি সমস্ত অক্ষরকে সামঞ্জস্য করতে পারে উৎস স্ট্রিং



#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';
গৃহস্থালিdestination_str[30];

printf (Strcpy () ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

strcpy (destination_str,source_str);

printf (Strcpy () ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

প্রত্যাবর্তন 0;
}

strcpy ()-কেস -1 (example2.c):

এই উদাহরণ প্রোগ্রামের উদ্দেশ্য হল স্পষ্টভাবে ব্যাখ্যা করা যখন গন্তব্য স্ট্রিং এর দৈর্ঘ্য উৎস স্ট্রিং এর দৈর্ঘ্যের চেয়ে কম হয়। এই ধরনের ক্ষেত্রে, গন্তব্য স্থানে উৎস স্ট্রিং থেকে সমস্ত অক্ষর (NULL অক্ষর সহ) মিটমাট করার জন্য পর্যাপ্ত স্থান/বাইট থাকবে না। দুটি জিনিস, আপনার সর্বদা মনে রাখা উচিত:

  1. Strcpy () ফাংশনটি গন্তব্যে পর্যাপ্ত জায়গা আছে কিনা তা পরীক্ষা করবে না।
  2. এটি এমবেডেড সফটওয়্যারে বিপজ্জনক হতে পারে কারণ strcpy () গন্তব্যের সীমানার বাইরে মেমরি এলাকা প্রতিস্থাপন করবে।

আসুন উদাহরণ প্রোগ্রাম দেখুন। আমরা source_str ঘোষণা করেছি এবং এটিকে আরম্ভ করেছি www.linuxhint.com , যা স্ট্রিংয়ের শেষে নাল অক্ষর সহ সঞ্চয় করতে মেমরিতে 18 বাইট লাগবে। তারপরে, আমরা আরেকটি অক্ষর অ্যারে ঘোষণা করেছি অর্থাৎ গন্তব্য_স্ট্র মাত্র 5 আকারের।

কিন্তু, তবুও, আমরা উৎস স্ট্রিংকে গন্তব্য স্ট্রিংয়ে অনুলিপি করার জন্য strcpy () ফাংশনটি কল করছি। নীচের আউটপুট থেকে, আমরা দেখতে পাচ্ছি strcpy () মোটেও অভিযোগ করেনি। এই ক্ষেত্রে, strcpy () ফাংশনটি সোর্স স্ট্রিং থেকে চরিত্রটি অনুলিপি করা শুরু করবে (যতক্ষণ না এটি সোর্স স্ট্রিংয়ে শূন্য অক্ষর খুঁজে পায়) গন্তব্য ঠিকানায় (যদিও গন্তব্য সীমা অতিক্রম করে)। এর মানে হল strcpy () ফাংশন গন্তব্য অ্যারের জন্য কোন সীমানা পরীক্ষা করে না। অবশেষে, strcpy () ফাংশন মেমরি ঠিকানাগুলিকে ওভাররাইট করবে যা গন্তব্য অ্যারে বরাদ্দ করা হয় না। এই কারণেই strcpy () ফাংশন মেমরি লোকেশনগুলিকে ওভাররাইট করে শেষ করবে যা একটি ভিন্ন ভেরিয়েবলে বরাদ্দ হতে পারে।

এই উদাহরণে, আমরা নীচের আউটপুট থেকে দেখতে পাচ্ছি যে strcpy () ফাংশনটি সোর্স স্ট্রিংকেই ওভাররাইট করে। প্রোগ্রামারদের সবসময় এই ধরনের আচরণের ব্যাপারে সতর্ক থাকতে হবে।

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';
গৃহস্থালিdestination_str[5];

printf (Strcpy () ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

strcpy (destination_str,source_str);

printf (Strcpy () ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

// printf ('উৎস ঠিকানা = %u (0x %x) n', & source_str [0], & source_str [0]);
// printf ('গন্তব্য ঠিকানা = %u (0x %x) n', & destination_str [0], & destination_str [0]);

প্রত্যাবর্তন 0;
}

strcpy ()-কেস -2 (example3.c):

এই প্রোগ্রামটি পরিস্থিতি ব্যাখ্যা করে যখন গন্তব্য স্ট্রিং আকার উৎস স্ট্রিং আকারের চেয়ে বড় হয় এবং গন্তব্য স্ট্রিং ইতিমধ্যে কিছু মান দিয়ে শুরু করা হয়। এই উদাহরণে, আমরা শুরু করেছি:

  • source_str থেকে www.linuxhint.com [আকার = 17+1 = 18]
  • I_AM_A_DESTINATION_STRING এ ডেস্টিনেশন_স্ট্র [সাইজ = ২৫+১ = ২]]

Strcpy () ফাংশনটি সোর্স স্ট্রিং থেকে গন্তব্য স্ট্রিং পর্যন্ত 17 টি অক্ষর এবং শূন্য অক্ষর অনুলিপি করবে। কিন্তু, এটি গন্তব্য অ্যারেতে অবশিষ্ট বাইট (বাইট 19 থেকে 26, একটি ভিত্তিক) প্রতিস্থাপন/পরিবর্তন করবে না। আমরা গন্তব্য অ্যারের উপর পুনরাবৃত্তির জন্য লুপ ব্যবহার করেছি এবং পুরো অ্যারে মুদ্রণ করে প্রমাণ করেছি যে গন্তব্য অ্যারেতে বাইট -১ to থেকে ২ 26 অপরিবর্তিত রয়েছে। এজন্য আমরা শেষ আউটপুটটি দেখতে পাই:

www.linuxhint.com_STRING

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত


/* এই প্রোগ্রামটি পরিস্থিতির চিত্র তুলে ধরে যখন:

গন্তব্য স্ট্রিং আকার> উৎস স্ট্রিং আকার

এবং আমরা কপি করার জন্য strcpy () ফাংশন চালাই
গন্তব্যে উৎস স্ট্রিং।

দ্রষ্টব্য: গন্তব্য স্ট্রিং আকার সর্বদা হওয়া উচিত
উৎস স্ট্রিং এর চেয়ে বড় বা সমান হতে হবে।
* /

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';
গৃহস্থালিdestination_str[26] = 'I_AM_A_DESTINATION_STRING';

printf (Strcpy () ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

strcpy (destination_str,source_str);

printf (Strcpy () ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);


/* লুপ ব্যবহার করে গন্তব্য স্ট্রিং মুদ্রণ করুন*/
printf ('গন্তব্য স্ট্রিং চারটি চার দ্বারা মুদ্রণ করুন:nn');
printf (' টিগন্তব্য স্ট্রিং = ');

জন্য(intআমি=0;আমি<25;আমি++)
{
printf ('% c',destination_str[আমি]);
}
printf ('nn');

প্রত্যাবর্তন 0;
}

strcpy ()-কেস -3 (example4.c):

আমরা এই প্রোগ্রামটিকে একটি উদাহরণ হিসেবে বিবেচনা করেছি যাতে দেখানো হয় যে, আমরা কখনই strcpy () কে স্ট্রিং আক্ষরিক গন্তব্য হিসাবে কল করব না। এটি অনির্ধারিত আচরণের কারণ হবে এবং অবশেষে, প্রোগ্রামটি ক্র্যাশ হবে।

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';

printf (Strcpy () ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);

/* কখনোই strcpy () স্ট্রিং আক্ষরিক গন্তব্য হিসাবে কল করবেন না।
প্রোগ্রাম ক্র্যাশ হবে।
* /

strcpy ('destination_str',source_str);

printf (Strcpy () ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);

প্রত্যাবর্তন 0;
}

strcpy () - ব্যবহারকারী সংজ্ঞায়িত সংস্করণ (example5.c):

এই উদাহরণ প্রোগ্রামে, আমরা দেখিয়েছি কিভাবে strcpy () ফাংশনের ব্যবহারকারী-সংজ্ঞায়িত সংস্করণ লিখতে হয়।

#অন্তর্ভুক্ত
গৃহস্থালি *strcpy_user_defined(গৃহস্থালি *ভাগ্য, const গৃহস্থালি *src);

/ * Strcpy () ফাংশনের ব্যবহারকারী সংজ্ঞায়িত সংস্করণ */
গৃহস্থালি *strcpy_user_defined(গৃহস্থালি *ভাগ্য, const গৃহস্থালি *src)
{
গৃহস্থালি *dest_backup=ভাগ্য;

যখন(*src! = ' 0') /* ' 0' না পাওয়া পর্যন্ত পুনরাবৃত্তি করুন।*/
{
*ভাগ্য= *src; / * গন্তব্যে উৎসের কপি কপি করুন */
src++; / * ইনক্রিমেন্ট সোর্স পয়েন্টার */
ভাগ্য++; / * বৃদ্ধি গন্তব্য পয়েন্টার */
}

*ভাগ্য= ' 0'; /* স্পষ্টভাবে গন্তব্যে ' 0' সন্নিবেশ করান*/

প্রত্যাবর্তনdest_backup;
}

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';
গৃহস্থালিdestination_str[30];

printf ('ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

/ * ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন */
strcpy_user_defined(destination_str,source_str);

printf ('ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

প্রত্যাবর্তন 0;
}

strcpy () - ব্যবহারকারী সংজ্ঞায়িত সংস্করণ অনুকূলিত (example6.c):

এখন, এই উদাহরণ প্রোগ্রামে, আমরা strcpy () এর ব্যবহারকারী-সংজ্ঞায়িত সংস্করণটি অপ্টিমাইজ করতে যাচ্ছি।

#অন্তর্ভুক্ত
গৃহস্থালি *strcpy_user_defined(গৃহস্থালি *ভাগ্য, const গৃহস্থালি *src);


/ * ব্যবহারকারীর সংজ্ঞায়িত strcpy () ফাংশনের অপ্টিমাইজড সংস্করণ */
গৃহস্থালি *strcpy_user_defined(গৃহস্থালি *ভাগ্য, const গৃহস্থালি *src)
{
গৃহস্থালি *dest_backup=ভাগ্য;

যখন(*ভাগ্য++ = *src++)
;

প্রত্যাবর্তনdest_backup;
}

intপ্রধান()
{
গৃহস্থালিsource_str[] = 'www.linuxhint.com';
গৃহস্থালিdestination_str[30];

printf ('ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন কল করার আগে:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

/ * ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন */
strcpy_user_defined(destination_str,source_str);

printf ('ব্যবহারকারী সংজ্ঞায়িত স্ট্রিং কপি ফাংশন চালানোর পর:nn');
printf (' টিউৎস স্ট্রিং = %sn',source_str);
printf (' টিগন্তব্য স্ট্রিং = %snn',destination_str);

প্রত্যাবর্তন 0;
}

উপসংহার :

Strcpy () ফাংশনটি সি প্রোগ্রামিং ভাষায় স্ট্রিং কপি অপারেশন করার জন্য একটি খুব জনপ্রিয় এবং সহজ লাইব্রেরি ফাংশন। এটি মূলত একটি অবস্থান থেকে অন্য স্থানে স্ট্রিং কপি করার জন্য ব্যবহৃত হয়। যাইহোক, আমরা এই সত্যটি পুনরাবৃত্তি করতে চাই যে strcpy () ফাংশন গন্তব্য অ্যারের জন্য সীমানা পরীক্ষা করে না, যা উপেক্ষা করা হলে একটি গুরুতর সফ্টওয়্যার বাগ হতে পারে। গন্তব্য অ্যারে নুল অক্ষর সহ উত্স স্ট্রিং থেকে সমস্ত অক্ষর ধরে রাখার জন্য পর্যাপ্ত জায়গা আছে তা নিশ্চিত করার জন্য এটি সর্বদা প্রোগ্রামারের দায়িত্ব।