Bagaimana cara menggunakan Strcpy () dalam bahasa C?

How Use Strcpy C Language



Dalam artikel ini, kita akan belajar tentang fungsi strcpy () dalam bahasa pengaturcaraan C. Fungsi strcpy () adalah fungsi perpustakaan standard yang sangat popular untuk melakukan operasi penyalinan rentetan dalam bahasa pengaturcaraan C. Terdapat beberapa fail header standard dalam bahasa pengaturcaraan C untuk melakukan operasi standard. String.h adalah salah satu fail header tersebut, yang menyediakan beberapa fungsi perpustakaan standard untuk melakukan operasi rentetan. Fungsi strcpy () adalah salah satu fungsi perpustakaan yang disediakan oleh string.h.

Sintaks:

char* strcpy (char*destinasi_lokasi, penyambung char*sumber_string);

Memahami strcpy ():

Tujuan tunggal fungsi strcpy () adalah menyalin rentetan dari sumber ke destinasi. Sekarang, mari kita lihat sintaks fungsi strcpy () di atas. Fungsi strcpy () mampu menerima dua parameter -







  • destinasi char *
  • sumber const *

Sumbernya adalah pemalar di sini untuk memastikan bahawa fungsi strcpy () tidak dapat mengubah rentetan sumber. Fungsi strcpy () menyalin semua watak (termasuk watak NULL di hujung rentetan) dari rentetan sumber ke tujuan. Setelah operasi penyalinan selesai dari sumber ke destinasi, fungsi strcpy () mengembalikan alamat tujuan kembali ke fungsi pemanggil.



Perkara penting untuk diperhatikan di sini adalah, fungsi strcpy () tidak menambahkan rentetan sumber dengan rentetan tujuan. Ia lebih mengganti kandungan destinasi dengan kandungan rentetan sumber.



Fungsi strcpy () juga tidak melakukan pemeriksaan untuk memastikan bahawa ukuran tujuan lebih banyak daripada rentetan sumber, itu sepenuhnya tanggungjawab pengaturcara.





Contoh:

Sekarang, kita akan melihat beberapa contoh untuk memahami fungsi strcpy ():

  1. strcpy () - Operasi Biasa (contoh1.c)
  2. strcpy () - Kes-1 (contoh2.c)
  3. strcpy () - Kes-2 (contoh3.c)
  4. strcpy () - Kes-3 (contoh4.c)
  5. strcpy () - Versi Ditetapkan Pengguna (contoh5.c)
  6. strcpy () - Versi Ditetapkan Pengguna Dioptimumkan (contoh6.c)

strcpy () - Operasi Biasa (contoh1.c):

Program contoh ini menunjukkan cara melakukan operasi penyalinan rentetan biasa menggunakan fungsi strcpy () dalam bahasa pengaturcaraan C. Harap maklum bahawa panjang rentetan tujuan adalah 30 (char destination_str [30];), yang lebih besar daripada panjang rentetan sumber (panjangnya 18 termasuk aksara NULL) sehingga tujuan dapat menampung semua watak dari rentetan sumber.



#sertakan
#sertakan

intutama()
{
charsumber_str[] = 'www.linuxhint.com';
chardestinasi_str[30];

printf (Sebelum memanggil fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

strcpy (destinasi_str,sumber_str);

printf ('Setelah menjalankan fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

kembali 0;
}

strcpy () - Kes-1 (contoh2.c):

Tujuan program contoh ini adalah untuk menjelaskan dengan jelas apa yang berlaku apabila panjang rentetan tujuan kurang dari panjang rentetan sumber. Dalam kes sedemikian, lokasi tujuan tidak akan mempunyai ruang / bait yang mencukupi untuk menampung semua watak (termasuk watak NULL) dari rentetan sumber. Dua perkara, anda harus selalu ingat:

  1. Fungsi strcpy () tidak akan memeriksa sama ada destinasi mempunyai cukup ruang.
  2. Ini mungkin berbahaya dalam perisian yang disematkan kerana strcpy () akan menggantikan kawasan memori di luar batas tujuan.

Mari kita lihat contoh program. Kami telah menyatakan source_str dan memulakannya menjadi www.linuxhint.com , yang memerlukan memori 18 bait untuk disimpan, termasuk watak Null di hujung rentetan. Kemudian, kami telah menyatakan array aksara lain iaitu destination_str dengan ukuran hanya 5. Oleh itu, destination_str tidak dapat menahan rentetan sumber dengan ukuran keseluruhan 18 bait.

Tetapi, kami masih memanggil fungsi strcpy () untuk menyalin rentetan sumber ke rentetan tujuan. Dari output di bawah, kita dapat melihat strcpy () sama sekali tidak mengeluh. Dalam kes ini, fungsi strcpy () akan mula menyalin watak dari rentetan sumber (sehingga ia menemui watak NULL dalam rentetan sumber) ke alamat tujuan (walaupun had tujuan melebihi). Ini bermaksud fungsi strcpy () tidak melakukan pemeriksaan sempadan untuk array tujuan. Akhirnya, fungsi strcpy () akan menimpa alamat memori yang tidak diperuntukkan ke array tujuan. Inilah sebabnya mengapa fungsi strcpy () akhirnya akan menimpa lokasi memori yang mungkin dialokasikan ke pemboleh ubah yang berbeza.

Dalam contoh ini, kita dapat melihat dari output di bawah, bahawa fungsi strcpy () menimpa rentetan sumber itu sendiri. Pengaturcara harus sentiasa berhati-hati dengan tingkah laku seperti itu.

#sertakan
#sertakan

intutama()
{
charsumber_str[] = 'www.linuxhint.com';
chardestinasi_str[5];

printf (Sebelum memanggil fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

strcpy (destinasi_str,sumber_str);

printf ('Setelah menjalankan fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

// printf ('Alamat Sumber =% u (0x% x) n', & source_str [0], & source_str [0]);
// printf ('Alamat Destinasi =% u (0x% x) n', & destination_str [0], & destination_str [0]);

kembali 0;
}

strcpy () - Kes-2 (contoh3.c):

Program ini menggambarkan keadaan ketika ukuran rentetan tujuan lebih besar daripada ukuran rentetan sumber dan rentetan tujuan sudah dimulakan dengan beberapa nilai. Dalam contoh ini, kami telah memulakan:

  • source_str ke www.linuxhint.com [saiz = 17 + 1 = 18]
  • destination_str to I_AM_A_DESTINATION_STRING [saiz = 25 + 1 = 26]

Fungsi strcpy () akan menyalin semua 17 aksara dan watak NULL dari rentetan sumber ke rentetan tujuan. Tetapi, ia tidak akan menggantikan / menukar bait yang tinggal (Byte 19 hingga 26, satu berdasarkan) dalam array tujuan. Kami telah menggunakan loop untuk melakukan iterasi pada array tujuan dan mencetak keseluruhan array untuk membuktikan bahawa byte-19 hingga 26 tidak berubah dalam array tujuan. Itulah sebabnya kami melihat output terakhir sebagai:

www.linuxhint.com_STRING .

#sertakan
#sertakan


/ * Program ini menggambarkan keadaan apabila:

ukuran rentetan tujuan> ukuran rentetan sumber

dan kami menjalankan fungsi strcpy () untuk menyalin
rentetan sumber ke destinasi.

Nota: Ukuran rentetan tujuan mesti selalu
lebih besar daripada atau sama dengan rentetan sumber.
* /

intutama()
{
charsumber_str[] = 'www.linuxhint.com';
chardestinasi_str[26] = 'I_AM_A_DESTINATION_STRING';

printf (Sebelum memanggil fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

strcpy (destinasi_str,sumber_str);

printf ('Setelah menjalankan fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);


/ * cetak rentetan tujuan menggunakan gelung * /
printf ('Cetak rentetan tujuan dengan char: n n');
printf (' tRentetan Destinasi = ');

untuk(inti=0;i<25;i++)
{
printf ('% c',destinasi_str[i]);
}
printf (' n n');

kembali 0;
}

strcpy () - Kes-3 (contoh4.c):

Kami menganggap program ini sebagai contoh untuk menunjukkan bahawa kami tidak boleh memanggil strcpy () dengan rentetan literal sebagai tujuan. Ini akan menyebabkan tingkah laku yang tidak ditentukan dan akhirnya, program akan terhenti.

#sertakan
#sertakan

intutama()
{
charsumber_str[] = 'www.linuxhint.com';

printf (Sebelum memanggil fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);

/ * Jangan panggil strcpy () dengan rentetan literal sebagai tujuan.
Program akan terhenti.
* /

strcpy ('destinasi_str',sumber_str);

printf ('Setelah menjalankan fungsi strcpy (): n n');
printf (' tRentetan Sumber =% s n',sumber_str);

kembali 0;
}

strcpy () - Versi Ditetapkan Pengguna (contoh5.c):

Dalam program contoh ini, kami telah menunjukkan cara menulis versi fungsi strcpy () yang ditentukan pengguna.

#sertakan
char *strcpy_user_definisi(char *dest, penyambung char *src);

/ * Versi ditentukan fungsi strcpy () fungsi * /
char *strcpy_user_definisi(char *dest, penyambung char *src)
{
char *dest_backup=dest;

sementara(*src! = ' 0') / * Ulangi sehingga ' 0' dijumpai. * /
{
*dest= *src; / * Salin char sumber ke destinasi * /
src++; / * Penunjuk sumber kenaikan * /
dest++; / * Penunjuk tujuan kenaikan * /
}

*dest= ' 0'; / * Masukkan ' 0' di destinasi dengan jelas * /

kembalidest_backup;
}

intutama()
{
charsumber_str[] = 'www.linuxhint.com';
chardestinasi_str[30];

printf ('Sebelum memanggil fungsi salinan rentetan yang ditentukan pengguna: n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

/ * Memanggil fungsi salinan rentetan yang ditentukan pengguna * /
strcpy_user_definisi(destinasi_str,sumber_str);

printf ('Setelah menjalankan fungsi salinan rentetan yang ditentukan pengguna: n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

kembali 0;
}

strcpy () - Versi Ditentukan Pengguna Dioptimumkan (contoh6.c):

Sekarang, dalam program contoh ini, kita akan mengoptimumkan versi strcpy () yang ditentukan pengguna.

#sertakan
char *strcpy_user_definisi(char *dest, penyambung char *src);


/ * Versi dioptimumkan fungsi strcpy () yang ditentukan pengguna * /
char *strcpy_user_definisi(char *dest, penyambung char *src)
{
char *dest_backup=dest;

sementara(*dest++ = *src++)
;

kembalidest_backup;
}

intutama()
{
charsumber_str[] = 'www.linuxhint.com';
chardestinasi_str[30];

printf ('Sebelum memanggil fungsi salinan rentetan yang ditentukan pengguna: n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

/ * Memanggil fungsi salinan rentetan yang ditentukan pengguna * /
strcpy_user_definisi(destinasi_str,sumber_str);

printf ('Setelah menjalankan fungsi salinan rentetan yang ditentukan pengguna: n n');
printf (' tRentetan Sumber =% s n',sumber_str);
printf (' tRentetan Destinasi =% s n n',destinasi_str);

kembali 0;
}

Kesimpulannya :

Fungsi strcpy () adalah fungsi perpustakaan yang sangat popular dan berguna untuk melakukan operasi penyalinan rentetan dalam bahasa pengaturcaraan C. Ini digunakan terutamanya untuk menyalin rentetan dari satu lokasi ke lokasi lain. Namun, kami ingin mengulangi kenyataan bahawa fungsi strcpy () tidak melakukan pemeriksaan batas untuk array tujuan, yang boleh menyebabkan bug perisian serius jika diabaikan. Selalu menjadi tanggungjawab pengaturcara untuk memastikan susunan tujuan mempunyai ruang yang cukup untuk menyimpan semua watak dari rentetan sumber termasuk watak NULL.