Bagaimana cara menggunakan Strcpy() dalam bahasa C?

Bagaimana cara menggunakan Strcpy() dalam bahasa C?

Pada artikel ini, kita akan belajar tentang fungsi strcpy() dalam bahasa pemrograman C. Fungsi strcpy() adalah fungsi library standar yang sangat populer untuk melakukan operasi penyalinan string dalam bahasa pemrograman C. Ada beberapa file header standar dalam bahasa pemrograman C untuk melakukan operasi standar. “string.h” adalah salah satu file header tersebut, yang menyediakan beberapa fungsi perpustakaan standar untuk melakukan operasi string. Fungsi “strcpy()” adalah salah satu fungsi library yang disediakan oleh “string.h”.

Sintaksis:

char* strcpy (char* destination_location, const char* source_string);

Memahami strcpy():

Satu-satunya tujuan dari fungsi strcpy() adalah untuk menyalin string dari sumber ke tujuan. Sekarang, mari kita lihat sintaks fungsi strcpy() di atas. Fungsi strcpy() mampu menerima dua parameter –

  • karakter * tujuan
  • const char * sumber

Sumber adalah konstanta di sini untuk memastikan bahwa fungsi strcpy() tidak dapat mengubah string sumber. Fungsi strcpy() menyalin semua karakter (termasuk karakter NULL di akhir string) dari string sumber ke tujuan. Setelah operasi penyalinan selesai dari sumber ke tujuan, fungsi strcpy() mengembalikan alamat tujuan kembali ke fungsi pemanggil.

Poin penting untuk diperhatikan di sini adalah, fungsi strcpy() tidak menambahkan string sumber dengan string tujuan. Ini lebih menggantikan konten tujuan dengan konten string sumber.

Juga, fungsi strcpy() tidak melakukan pemeriksaan apa pun untuk memastikan bahwa ukuran tujuan lebih dari string sumber, itu sepenuhnya menjadi tanggung jawab programmer.

Contoh:

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

  1. strcpy() – Operasi Normal (example1.c)
  2. strcpy() – Kasus-1 (contoh2.c)
  3. strcpy() – Kasus-2 (contoh3.c)
  4. strcpy() – Kasus-3 (contoh4.c)
  5. strcpy() – Versi Buatan Pengguna (example5.c)
  6. strcpy() – Versi Buatan Pengguna Dioptimalkan (example6.c)

strcpy() – Operasi Normal (example1.c):

Contoh program ini menunjukkan cara melakukan operasi penyalinan string normal menggunakan fungsi strcpy() dalam bahasa pemrograman C. Harap dicatat bahwa panjang string tujuan adalah 30 (char destination_str[30]; ), yang lebih besar dari panjang string sumber (panjangnya 18 termasuk karakter NULL) sehingga tujuan dapat menampung semua karakter dari string sumber.

#include <stdio.h>
#include <string.h>
   
int main()
{
    char source_str[] = "www.linuxhint.com";
    char destination_str[30];          
   
    printf("Before calling strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    strcpy(destination_str, source_str);  
   
    printf("After executing strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    return 0;
}

strcpy() – Kasus-1 (contoh2.c):

Maksud dari program contoh ini adalah untuk menjelaskan dengan jelas apa yang terjadi ketika panjang string tujuan kurang dari panjang string sumber. Dalam kasus seperti itu, lokasi tujuan tidak akan memiliki cukup spasi/byte untuk menampung semua karakter (termasuk karakter NULL) dari string sumber. Dua hal yang harus selalu Anda ingat:

  1. Fungsi strcpy() tidak akan memeriksa apakah tujuan memiliki cukup ruang.
  2. Ini bisa berbahaya dalam perangkat lunak yang disematkan karena strcpy() akan menggantikan area memori di luar batas tujuan.

Mari kita lihat contoh programnya. Kami telah mendeklarasikan source_str dan menginisialisasinya ke “ www.linuxhint.com ”, yang akan mengambil 18 byte dalam memori untuk disimpan, termasuk karakter Null di akhir string. Kemudian, kita telah mendeklarasikan array karakter lain yaitu destination_str dengan ukuran hanya 5. Jadi, destination_str tidak dapat menampung string sumber dengan ukuran total 18 byte.

Tapi, tetap saja, kita memanggil fungsi strcpy() untuk menyalin string sumber ke string tujuan. Dari output di bawah ini, kita dapat melihat strcpy() tidak mengeluh sama sekali. Dalam hal ini, fungsi strcpy() akan mulai menyalin karakter dari string sumber (sampai menemukan karakter NULL dalam string sumber) ke alamat tujuan (meskipun batas tujuan melebihi). Itu berarti fungsi strcpy() tidak melakukan pemeriksaan batas untuk larik tujuan. Akhirnya, fungsi strcpy() akan menimpa alamat memori yang tidak dialokasikan ke larik tujuan. Inilah sebabnya mengapa fungsi strcpy() akan berakhir menimpa lokasi memori yang mungkin dialokasikan ke variabel yang berbeda.

Dalam contoh ini, kita dapat melihat dari output di bawah ini, bahwa fungsi strcpy() menimpa string sumber itu sendiri. Programmer harus selalu berhati-hati dengan perilaku seperti itu.

#include <stdio.h>
#include <string.h>
   
int main()
{
    char source_str[] = "www.linuxhint.com";
    char destination_str[5];
   
    printf("Before calling strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    strcpy(destination_str, source_str);  
   
    printf("After executing strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_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]);
   
    return 0;
}

strcpy() – Kasus-2 (contoh3.c):

Program ini menggambarkan situasi ketika ukuran string tujuan lebih besar dari ukuran string sumber dan string tujuan sudah diinisialisasi dengan beberapa nilai. Dalam contoh ini, kami telah menginisialisasi:

  • source_str ke “ www.linuxhint.com ” [ukuran = 17+1 = 18]
  • destination_str ke “I_AM_A_DESTINATION_STRING” [ukuran = 25+1 = 26]

Fungsi strcpy() akan menyalin semua 17 karakter dan karakter NULL dari string sumber ke string tujuan. Tapi, itu tidak akan menggantikan/mengubah byte yang tersisa (Byte 19 hingga 26, berbasis satu) di larik tujuan. Kami telah menggunakan for loop untuk mengulangi larik tujuan dan mencetak seluruh larik untuk membuktikan bahwa byte-19 hingga 26 tidak berubah dalam larik tujuan. Itu sebabnya kami melihat output terakhir sebagai:

www.linuxhint.com_STRING ”.

#include <stdio.h>
#include <string.h>


/* This program illustrates the situation when :
   
    destination string size > source string size
   
    and we execute strcpy() function to copy the
    source string to destination.
   
    Note: destination string size should always
    be greater than or equal to the source string.
*/
int main()
{
    char source_str[] = "www.linuxhint.com";
    char destination_str[26] = "I_AM_A_DESTINATION_STRING";
   
    printf("Before calling strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    strcpy(destination_str, source_str);  
   
    printf("After executing strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);

   
    /* print destination string using for loop*/   
    printf("Print the destination string char by char : nn");
    printf("tDestination String  = ");
   
    for(int i=0; i<25;i++)
    {
        printf("%c", destination_str[i]);
    }
    printf("nn");
   
    return 0;
}

strcpy() – Kasus-3 (contoh4.c):

Kami telah menganggap program ini sebagai contoh untuk menunjukkan bahwa kami tidak boleh memanggil strcpy() dengan string literal sebagai tujuan. Ini akan menyebabkan perilaku tidak terdefinisi dan akhirnya, program akan macet.

#include <stdio.h>
#include <string.h>
   
int main()
{
    char source_str[] = "www.linux hint.com";
   
    printf("Before calling strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
   
    /* Never call strcpy() with string literal as destination.
       program will crash.
    */
    strcpy("destination_str", source_str);  
   
    printf("After executing strcpy() function : nn");
    printf("tSource String       = %sn", source_str);
   
    return 0;
}

strcpy() – Versi Buatan Pengguna (example5.c):

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

#include <stdio.h>
char * strcpy_user_defined(char *dest, const char * src);

/* User defined version of strcpy() function */
char * strcpy_user_defined(char *dest, const char * src)
{
    char * dest_backup = dest;
   
    while(*src != ' ')    /* Iterate until ' ' is found.*/
    {
        *dest = *src;     /* Copy source char to destination */
        src++;            /* Increment source pointer */
        dest++;         /* Increment destination pointer */
    }
   
    *dest = ' ';         /* Insert ' ' in destination explicitly*/
   
    return dest_backup;
}
   
int main()
{
    char source_str[] = "www.linuxhint.com";
    char destination_str[30];
   
    printf("Before calling user defined string copy function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    /* Calling user defined string copy function */
    strcpy_user_defined(destination_str, source_str);  
   
    printf("After executing user defined string copy function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    return 0;
}

strcpy() – Versi Buatan Pengguna Dioptimalkan (example6.c):

Sekarang, dalam contoh program ini, kita akan mengoptimalkan versi strcpy() yang ditentukan user.

#include <stdio.h>
char * strcpy_user_defined(char *dest, const char * src);


/* Optimized version of user defined strcpy() function */
char * strcpy_user_defined(char *dest, const char * src)
{  
    char * dest_backup = dest;
   
    while(*dest++ = *src++)
    ;
   
    return dest_backup;
}
   
int main()
{
    char source_str[] = "www.linuxhint.com";
    char destination_str[30];
   
    printf("Before calling user defined string copy function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    /* Calling user defined string copy function */
    strcpy_user_defined(destination_str, source_str);  
   
    printf("After executing user defined string copy function : nn");
    printf("tSource String       = %sn", source_str);
    printf("tDestination String  = %snn", destination_str);
   
    return 0;
}

Kesimpulan:

Fungsi strcpy() adalah fungsi library yang sangat populer dan berguna untuk melakukan operasi penyalinan string dalam bahasa pemrograman C. Ini terutama digunakan untuk menyalin string dari satu lokasi ke lokasi lain. Namun, kami ingin menegaskan kembali fakta bahwa fungsi strcpy() tidak melakukan pemeriksaan batas untuk larik tujuan, yang dapat menyebabkan bug perangkat lunak yang serius jika diabaikan. Itu selalu menjadi tanggung jawab programmer untuk memastikan array tujuan memiliki cukup ruang untuk menampung semua karakter dari string sumber termasuk karakter NULL.

Related Posts