C زبان میں Strcpy () کا استعمال کیسے کریں؟

How Use Strcpy C Language



اس آرٹیکل میں ، ہم سی پروگرامنگ زبان میں strcpy () فنکشن کے بارے میں جاننے والے ہیں۔ strcpy () فنکشن ایک بہت ہی مقبول سٹینڈرڈ لائبریری فنکشن ہے جو C پروگرامنگ لینگویج میں سٹرنگ کاپی آپریشن کو انجام دیتا ہے۔ معیاری کام کرنے کے لیے سی پروگرامنگ زبان میں کئی معیاری ہیڈر فائلیں ہیں۔ string.h ایسی ہیڈر فائلوں میں سے ایک ہے ، جو سٹرنگ آپریشن کرنے کے لیے کئی معیاری لائبریری افعال مہیا کرتی ہے۔ strcpy () تقریب لائبریری کے افعال میں سے ایک ہے جو string.h کے ذریعہ فراہم کی گئی ہے۔

نحو:

چار* strcpy (چار*منزل_ مقام، const چار*Source_string)؛

strcpy () کو سمجھنا:

strcpy () فنکشن کا واحد مقصد ایک سٹرنگ کو سورس سے منزل تک کاپی کرنا ہے۔ اب ، آئیے strcpy () فنکشن کے مذکورہ نحو کو دیکھیں۔ strcpy () فنکشن دو پیرامیٹرز کو قبول کرنے کے قابل ہے -







  • چار * منزل
  • 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 ہے سورس سٹرنگ



#شامل کریں
#شامل کریں

intمرکزی()
{
چارsource_str[] = 'www.linuxhint.com'؛
چارمنزل_اسٹر[30۔]؛

پرنٹ ایف (strcpy () فنکشن کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

strcpy (منزل_اسٹر،source_str)؛

پرنٹ ایف (strcpy () فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

واپسی ؛
}

strcpy ()-کیس -1 (example2.c):

اس مثال کے پروگرام کا ارادہ واضح طور پر بتانا ہے کہ جب منزل کی تار کی لمبائی سورس سٹرنگ کی لمبائی سے کم ہو تو کیا ہوتا ہے۔ ایسے معاملات میں ، منزل کے مقام میں سورس سٹرنگ سے تمام حروف (بشمول NULL کریکٹر) کو ایڈجسٹ کرنے کے لیے کافی جگہیں/بائٹس نہیں ہوں گے۔ دو چیزیں ، آپ کو ہمیشہ ذہن میں رکھنا چاہیے:

  1. strcpy () فنکشن چیک نہیں کرے گا کہ آیا منزل میں کافی جگہ ہے۔
  2. یہ سرایت شدہ سافٹ وئیر میں خطرناک ثابت ہو سکتا ہے کیونکہ strcpy () منزل کی حد سے باہر میموری کے علاقے کو بدل دے گا۔

آئیے مثال کے پروگرام کو دیکھیں۔ ہم نے source_str کا اعلان کیا ہے اور اسے شروع کیا ہے۔ www.linuxhint.com۔ ، جو میموری میں 18 بائٹس لے جائے گا ، بشمول تار کے آخر میں نال کردار۔ پھر ، ہم نے ایک اور کریکٹر سرنی یعنی منزل_سٹر کا اعلان کیا ہے جس کا سائز صرف 5 ہے۔ لہذا ، منزل_سٹر 18 بائٹس کے کل سائز کے ساتھ سورس سٹرنگ نہیں رکھ سکتی۔

لیکن ، پھر بھی ، ہم strcpy () فنکشن کو سورس سٹرنگ کو منزل کے تار میں کاپی کرنے کے لیے بلا رہے ہیں۔ مندرجہ ذیل آؤٹ پٹ سے ، ہم دیکھ سکتے ہیں کہ strcpy () نے بالکل شکایت نہیں کی۔ اس معاملے میں ، strcpy () فنکشن سورس سٹرنگ سے کریکٹر کو کاپی کرنا شروع کردے گا (جب تک کہ وہ سورس سٹرنگ میں NULL کریکٹر کو نہ مل جائے) منزل کے پتے پر (اگرچہ منزل کی حد سے تجاوز کر جائے)۔ اس کا مطلب ہے کہ strcpy () فنکشن منزل کی صف کے لئے کوئی حد کی جانچ نہیں کرتا ہے۔ آخر کار ، strcpy () فنکشن میموری ایڈریسز کو اوور رائٹ کردے گا جو منزل کی صف میں مختص نہیں ہیں۔ یہی وجہ ہے کہ strcpy () فنکشن میموری کے مقامات کو اوور رائٹ کرنا ختم کردے گا جو کسی مختلف متغیر کو مختص کیا جاسکتا ہے۔

اس مثال میں ، ہم نیچے آؤٹ پٹ سے دیکھ سکتے ہیں کہ strcpy () فنکشن سورس سٹرنگ کو ہی اوور رائٹ کرتا ہے۔ پروگرامرز کو ہمیشہ ایسے رویے سے محتاط رہنا چاہیے۔

#شامل کریں
#شامل کریں

intمرکزی()
{
چارsource_str[] = 'www.linuxhint.com'؛
چارمنزل_اسٹر[]؛

پرنٹ ایف (strcpy () فنکشن کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

strcpy (منزل_اسٹر،source_str)؛

پرنٹ ایف (strcpy () فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

// 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])؛

واپسی ؛
}

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 ، ایک پر مبنی) کو تبدیل/تبدیل نہیں کرے گا۔ ہم نے لوپ کے لیے استعمال کیا ہے تاکہ منزل کی صف پر تکرار ہو اور پوری صف کو پرنٹ کیا جائے تاکہ یہ ثابت کیا جا سکے کہ بائٹس 19 سے 26 منزل کی صف میں کوئی تبدیلی نہیں ہے۔ اسی وجہ سے ہم آخری پیداوار کو دیکھتے ہیں:

www.linuxhint.com_STRING۔ .

#شامل کریں
#شامل کریں


/* یہ پروگرام صورتحال کو واضح کرتا ہے جب:

منزل سٹرنگ سائز> ماخذ سٹرنگ سائز۔

اور ہم کاپی کرنے کے لیے strcpy () فنکشن پر عمل کرتے ہیں۔
منزل تک سورس سٹرنگ۔

نوٹ: منزل سٹرنگ کا سائز ہمیشہ ہونا چاہیے۔
سورس سٹرنگ سے زیادہ یا اس کے برابر ہو۔
* /

intمرکزی()
{
چارsource_str[] = 'www.linuxhint.com'؛
چارمنزل_اسٹر[26۔] = 'I_AM_A_DESTINATION_STRING'؛

پرنٹ ایف (strcpy () فنکشن کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

strcpy (منزل_اسٹر،source_str)؛

پرنٹ ایف (strcpy () فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛


/* لوپ کے لیے استعمال کرتے ہوئے منزل کی تار پرنٹ کریں*/
پرنٹ ایف ('منزل کے سٹرنگ چار کو چار پرنٹ کریں:nn')؛
پرنٹ ایف ('ٹیمنزل سٹرنگ = ')؛

کے لیے(intمیں=؛میں<25۔؛میں++۔)
{
پرنٹ ایف ('٪ c'،منزل_اسٹر[میں])؛
}
پرنٹ ایف ('nn')؛

واپسی ؛
}

strcpy ()-کیس -3 (example4.c):

ہم نے اس پروگرام کو ایک مثال کے طور پر سمجھا ہے تاکہ یہ ظاہر کیا جا سکے کہ ہمیں کبھی بھی strcpy () کو سٹرنگ لفظی کے ساتھ منزل نہیں کہنا چاہیے۔ یہ غیر متعینہ رویے کا سبب بنے گا اور آخر کار ، پروگرام کریش ہو جائے گا۔

#شامل کریں
#شامل کریں

intمرکزی()
{
چارsource_str[] = 'www.linuxhint.com'؛

پرنٹ ایف (strcpy () فنکشن کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛

/* کبھی بھی strcpy () کو سٹرنگ لفظی کے ساتھ منزل کے طور پر نہ کہیں۔
پروگرام ٹوٹ جائے گا۔
* /

strcpy ('destination_str'،source_str)؛

پرنٹ ایف (strcpy () فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛

واپسی ؛
}

strcpy () - یوزر ڈیفائنڈ ورژن (example5.c):

اس مثال کے پروگرام میں ، ہم نے دکھایا ہے کہ strcpy () فنکشن کے صارف کے متعین کردہ ورژن کو کیسے لکھیں۔

#شامل کریں
چار *strcpy_user_defined(چار *تقدیر، const چار *src)؛

/ * strcpy () فنکشن کا صارف کا متعین کردہ ورژن */
چار *strcpy_user_defined(چار *تقدیر، const چار *src)
{
چار *dest_backup=تقدیر؛

جبکہ(*src! = '') /* ' 0' ملنے تک تکرار کریں۔*/
{
*تقدیر= *src؛ / * منزل پر چار کاپی کریں
src++ / * انکریمنٹ سورس پوائنٹر */
تقدیر++ / * منزل مقصود کا اضافہ */
}

*تقدیر= ''؛ /* منزل میں واضح طور پر ' 0' داخل کریں*/

واپسیdest_backup؛
}

intمرکزی()
{
چارsource_str[] = 'www.linuxhint.com'؛
چارمنزل_اسٹر[30۔]؛

پرنٹ ایف ('صارف کے بیان کردہ سٹرنگ کاپی فنکشن کو کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

/ * صارف کی وضاحت شدہ سٹرنگ کاپی فنکشن */
strcpy_user_defined(منزل_اسٹر،source_str)؛

پرنٹ ایف ('صارف کے بیان کردہ سٹرنگ کاپی فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

واپسی ؛
}

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'؛
چارمنزل_اسٹر[30۔]؛

پرنٹ ایف ('صارف کے بیان کردہ سٹرنگ کاپی فنکشن کو کال کرنے سے پہلے:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

/ * صارف کی وضاحت شدہ سٹرنگ کاپی فنکشن */
strcpy_user_defined(منزل_اسٹر،source_str)؛

پرنٹ ایف ('صارف کے بیان کردہ سٹرنگ کاپی فنکشن پر عمل کرنے کے بعد:nn')؛
پرنٹ ایف ('ٹیماخذ سٹرنگ =٪ sn'،source_str)؛
پرنٹ ایف ('ٹیمنزل سٹرنگ =٪ snn'،منزل_اسٹر)؛

واپسی ؛
}

نتیجہ :

strcpy () فنکشن ایک بہت ہی مقبول اور آسان لائبریری فنکشن ہے جو کہ C پروگرامنگ زبان میں سٹرنگ کاپی آپریشن کو انجام دیتا ہے۔ یہ بنیادی طور پر تار کو ایک جگہ سے دوسرے مقام پر کاپی کرنے کے لیے استعمال ہوتا ہے۔ تاہم ، ہم اس حقیقت کا اعادہ کرنا چاہتے ہیں کہ strcpy () فنکشن منزل کی صف کی حد کی جانچ نہیں کرتا ہے ، جو نظرانداز ہونے پر ایک سنگین سافٹ ویئر بگ کا باعث بن سکتا ہے۔ یہ ہمیشہ پروگرامر کی ذمہ داری ہوتی ہے کہ اس بات کو یقینی بنائے کہ منزل کی صف میں اتنی گنجائش ہو کہ تمام حروف کو سٹرنگ سٹرنگ سے لے کر NULL کیریکٹر سمیت رکھ سکے۔