Pengaturcaraan C

Cara menggunakan Strcpy () dalam bahasa C?

Cara menggunakan Strcpy () dalam bahasa C?
Dalam artikel ini, kita akan belajar tentang fungsi strcpy () dalam bahasa pengaturcaraan C. Fungsi strcpy () adalah fungsi perpustakaan standard yang sangat popular untuk menjalankan operasi penyalinan rentetan dalam bahasa pengaturcaraan C. Terdapat beberapa fail header standard dalam bahasa pengaturcaraan C untuk melakukan operasi standard. Rentetan.h ”adalah salah satu fail header seperti itu, 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 * destination_location, const char * source_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 -

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 destinasi. Setelah operasi penyalinan selesai dari sumber ke destinasi, fungsi strcpy () mengembalikan alamat tujuan kembali ke fungsi pemanggil.

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

Juga, fungsi strcpy () 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 Ditentukan Pengguna Dioptimumkan (contoh6.c)

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

Program contoh ini menunjukkan bagaimana 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
int utama ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Sebelum memanggil fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("Setelah menjalankan fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
pulangan 0;

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

Tujuan program contoh ini adalah untuk menerangkan dengan jelas apa yang berlaku apabila panjang rentetan tujuan kurang daripada 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 boleh membahayakan perisian tertanam 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 akan disimpan dalam memori sebanyak 18 bait, termasuk watak Null di hujung rentetan. Kemudian, kami telah menyatakan susunan watak lain i.e. destination_str dengan ukuran hanya 5. Jadi, destination_str tidak dapat menahan rentetan sumber dengan ukuran keseluruhan 18 bait.

Tetapi, tetap saja, kita 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 batas 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
int utama ()

char source_str [] = "www.linuxhint.com ";
char destination_str [5];
printf ("Sebelum memanggil fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("Setelah menjalankan fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_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]);
pulangan 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 hingga "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 / mengubah 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:
saiz 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.
* /
int utama ()

char source_str [] = "www.linuxhint.com ";
char destination_str [26] = "I_AM_A_DESTINATION_STRING";
printf ("Sebelum memanggil fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
strcpy (destination_str, source_str);
printf ("Setelah menjalankan fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * cetak rentetan tujuan menggunakan gelung * /
printf ("Cetak rentetan destinasi dengan char: \ n \ n");
printf ("\ tDestination String =");
untuk (int i = 0; i<25;i++)

printf ("% c", destination_str [i]);

printf ("\ n \ n");
pulangan 0;

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

Kami telah 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
int utama ()

char source_str [] = "www.linuxhint.com ";
printf ("Sebelum memanggil fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
/ * Jangan panggil strcpy () dengan string literal sebagai tujuan.
Program akan terhenti.
* /
strcpy ("destination_str", source_str);
printf ("Setelah menjalankan fungsi strcpy (): \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
pulangan 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_defined (char * dest, const char * src);
/ * Versi yang ditentukan pengguna dari fungsi strcpy () * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
semasa (* src != '\ 0') / * Ikut sehingga '\ 0' dijumpai.* /

* dest = * src; / * Salin char sumber ke destinasi * /
src ++; / * Penunjuk sumber kenaikan * /
dest ++; / * Penunjuk tujuan kenaikan * /

* dest = '\ 0'; / * Masukkan '\ 0' di destinasi secara eksplisit * /
kembali dest_backup;

int utama ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Sebelum memanggil fungsi salinan rentetan yang ditentukan pengguna: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Memanggil fungsi salinan rentetan yang ditentukan pengguna * /
strcpy_user_defined (destination_str, source_str);
printf ("Setelah menjalankan fungsi salinan rentetan yang ditentukan pengguna: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
pulangan 0;

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

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

#sertakan
char * strcpy_user_defined (char * dest, const char * src);
/ * Versi dioptimumkan fungsi strcpy () yang ditentukan pengguna * /
char * strcpy_user_defined (char * dest, const char * src)

char * dest_backup = dest;
sementara (* dest ++ = * src ++)
;
kembali dest_backup;

int utama ()

char source_str [] = "www.linuxhint.com ";
char destination_str [30];
printf ("Sebelum memanggil fungsi salinan rentetan yang ditentukan pengguna: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
/ * Memanggil fungsi salinan rentetan yang ditentukan pengguna * /
strcpy_user_defined (destination_str, source_str);
printf ("Setelah menjalankan fungsi salinan rentetan yang ditentukan pengguna: \ n \ n");
printf ("\ tSource String =% s \ n", source_str);
printf ("\ tDestination String =% s \ n \ n", destination_str);
pulangan 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 fakta 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.

OpenTTD vs Simutrans
Membuat simulasi pengangkutan anda sendiri boleh menyeronokkan, santai dan sangat menarik. Itulah sebabnya anda perlu memastikan bahawa anda mencuba s...
Tutorial OpenTTD
OpenTTD adalah salah satu permainan simulasi perniagaan yang paling popular di luar sana. Dalam permainan ini, anda perlu membuat perniagaan pengangku...
SuperTuxKart untuk Linux
SuperTuxKart adalah tajuk hebat yang direka untuk membawa anda pengalaman Mario Kart secara percuma pada sistem Linux anda. Ia cukup mencabar dan meny...