Πώς να χρησιμοποιήσετε το Strcpy () στη γλώσσα C;

How Use Strcpy C Language



Σε αυτό το άρθρο, θα μάθουμε για τη συνάρτηση strcpy () στη γλώσσα προγραμματισμού C. Η συνάρτηση strcpy () είναι μια πολύ δημοφιλής συνήθης συνάρτηση βιβλιοθήκης για την εκτέλεση της λειτουργίας αντιγραφής συμβολοσειράς στη γλώσσα προγραμματισμού C. Υπάρχουν αρκετά τυπικά αρχεία κεφαλίδων στη γλώσσα προγραμματισμού C για την εκτέλεση τυπικών λειτουργιών. Το string.h είναι ένα από αυτά τα αρχεία κεφαλίδας, το οποίο παρέχει αρκετές τυπικές λειτουργίες βιβλιοθήκης για την εκτέλεση λειτουργιών συμβολοσειράς. Η συνάρτηση strcpy () είναι μία από τις συναρτήσεις βιβλιοθήκης που παρέχονται από το string.h.

Σύνταξη:

απανθρακώνω* strcpy (απανθρακώνω*τοποθεσία_ προορισμού, const απανθρακώνω*πηγή_χορδής)?

Κατανόηση του strcpy ():

Ο μόνος σκοπός της συνάρτησης strcpy () είναι να αντιγράψει μια συμβολοσειρά από την πηγή στον προορισμό. Τώρα, ας δούμε την παραπάνω σύνταξη της συνάρτησης strcpy (). Η συνάρτηση strcpy () μπορεί να δεχτεί δύο παραμέτρους -







  • char * προορισμός
  • const char * πηγή

Η πηγή είναι μια σταθερά εδώ για να διασφαλιστεί ότι η συνάρτηση strcpy () δεν μπορεί να αλλάξει τη συμβολοσειρά προέλευσης. Η συνάρτηση strcpy () αντιγράφει όλους τους χαρακτήρες (συμπεριλαμβανομένου του χαρακτήρα NULL στο τέλος της συμβολοσειράς) από τη συμβολοσειρά προέλευσης στον προορισμό. Μόλις ολοκληρωθεί η λειτουργία αντιγραφής από πηγή σε προορισμό, η συνάρτηση strcpy () επιστρέφει τη διεύθυνση του προορισμού πίσω στη λειτουργία καλούντος.



Το σημαντικό σημείο που πρέπει να προσέξετε εδώ είναι ότι η συνάρτηση strcpy () δεν προσθέτει τη συμβολοσειρά προέλευσης με τη συμβολοσειρά προορισμού. Αντικαθιστά μάλλον το περιεχόμενο του προορισμού με το περιεχόμενο της συμβολοσειράς προέλευσης.



Επίσης, η συνάρτηση strcpy () δεν πραγματοποιεί ελέγχους για να διασφαλίσει ότι το μέγεθος του προορισμού είναι μεγαλύτερο από τη συμβολοσειρά προέλευσης, είναι αποκλειστικά ευθύνη του προγραμματιστή.





Παραδείγματα:

Τώρα, θα δούμε αρκετά παραδείγματα για να κατανοήσουμε τη συνάρτηση strcpy ():

  1. strcpy () - Κανονική λειτουργία (παράδειγμα1.γ)
  2. strcpy ()-Περίπτωση-1 (παράδειγμα2.γ)
  3. strcpy ()-Περίπτωση 2 (παράδειγμα3.γ)
  4. strcpy ()-Περίπτωση-3 (παράδειγμα4.γ)
  5. strcpy () - Έκδοση καθορισμένη από το χρήστη (παράδειγμα5.γ)
  6. strcpy () - Βελτιστοποιημένη έκδοση καθορισμένη από το χρήστη (παράδειγμα6.γ)

strcpy () - Κανονική λειτουργία (παράδειγμα1.γ):

Αυτό το παράδειγμα προγράμματος δείχνει πώς να εκτελέσετε μια κανονική λειτουργία αντιγραφής συμβολοσειράς χρησιμοποιώντας τη συνάρτηση strcpy () στη γλώσσα προγραμματισμού C. Λάβετε υπόψη ότι το μήκος της συμβολοσειράς προορισμού είναι 30 (char destination_str [30];), το οποίο είναι μεγαλύτερο από το μήκος της συμβολοσειράς προέλευσης (το μήκος είναι 18 συμπεριλαμβανομένου του χαρακτήρα NULL), έτσι ώστε ο προορισμός να μπορεί να φιλοξενήσει όλους τους χαρακτήρες από το συμβολοσειρά πηγής.



#περιλαμβάνω
#περιλαμβάνω

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?
απανθρακώνωπροορισμός_στρ[30]?

printf ('Πριν καλέσετε τη λειτουργία strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

strcpy (προορισμός_στρ,πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

strcpy ()-Περίπτωση-1 (παράδειγμα2.γ):

Σκοπός αυτού του παραδείγματος προγράμματος είναι να εξηγήσει με σαφήνεια τι συμβαίνει όταν το μήκος της συμβολοσειράς προορισμού είναι μικρότερο από το μήκος της συμβολοσειράς προέλευσης. Σε τέτοιες περιπτώσεις, η τοποθεσία προορισμού δεν θα έχει αρκετά κενά/byte για να χωρέσει όλους τους χαρακτήρες (συμπεριλαμβανομένου του χαρακτήρα NULL) από τη συμβολοσειρά προέλευσης. Δύο πράγματα, που πρέπει πάντα να έχετε κατά νου:

  1. Η συνάρτηση strcpy () δεν θα ελέγξει εάν ο προορισμός έχει αρκετό χώρο.
  2. Αυτό θα μπορούσε να είναι επικίνδυνο στο ενσωματωμένο λογισμικό επειδή το strcpy () θα αντικαταστήσει την περιοχή μνήμης πέρα ​​από τα όρια του προορισμού.

Ας δούμε το παράδειγμα του προγράμματος. Έχουμε δηλώσει source_str και το έχουμε αρχικοποιήσει σε www.linuxhint.com , η οποία θα πάρει 18 byte στη μνήμη για αποθήκευση, συμπεριλαμβανομένου του χαρακτήρα Null στο τέλος της συμβολοσειράς. Στη συνέχεια, έχουμε δηλώσει έναν άλλο πίνακα χαρακτήρων, δηλαδή destination_str με μέγεθος μόνο 5. Έτσι, το destination_str δεν μπορεί να κρατήσει τη συμβολοσειρά προέλευσης με συνολικό μέγεθος 18 byte.

Ωστόσο, καλούμε τη συνάρτηση strcpy () για να αντιγράψουμε τη συμβολοσειρά προέλευσης στη συμβολοσειρά προορισμού. Από την παρακάτω έξοδο, μπορούμε να δούμε ότι το strcpy () δεν παραπονιόταν καθόλου. Σε αυτήν την περίπτωση, η συνάρτηση strcpy () θα αρχίσει να αντιγράφει τον χαρακτήρα από τη συμβολοσειρά προέλευσης (μέχρι να βρει τον χαρακτήρα NULL στη συμβολοσειρά προέλευσης) στη διεύθυνση προορισμού (αν και το όριο προορισμού υπερβαίνει). Αυτό σημαίνει ότι η συνάρτηση strcpy () δεν κάνει έλεγχο ορίων για πίνακα προορισμού. Τελικά, η συνάρτηση strcpy () θα αντικαταστήσει τις διευθύνσεις μνήμης που δεν έχουν εκχωρηθεί στον πίνακα προορισμού. Αυτός είναι ο λόγος για τον οποίο η συνάρτηση strcpy () θα καταλήξει να αντικαταστήσει τις θέσεις μνήμης που θα μπορούσαν να εκχωρηθούν σε διαφορετική μεταβλητή.

Σε αυτό το παράδειγμα, μπορούμε να δούμε από την παρακάτω έξοδο, ότι η συνάρτηση strcpy () αντικαθιστά την ίδια τη συμβολοσειρά προέλευσης. Οι προγραμματιστές πρέπει πάντα να είναι προσεκτικοί με τέτοια συμπεριφορά.

#περιλαμβάνω
#περιλαμβάνω

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?
απανθρακώνωπροορισμός_στρ[5]?

printf ('Πριν καλέσετε τη λειτουργία strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

strcpy (προορισμός_στρ,πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

// 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 (παράδειγμα3.γ):

Αυτό το πρόγραμμα απεικονίζει την κατάσταση όταν το μέγεθος της συμβολοσειράς προορισμού είναι μεγαλύτερο από το μέγεθος της συμβολοσειράς προέλευσης και η συμβολοσειρά προορισμού έχει ήδη αρχικοποιηθεί με κάποια τιμή. Σε αυτό το παράδειγμα, έχουμε αρχικοποιήσει:

  • source_str σε www.linuxhint.com [μέγεθος = 17+1 = 18]
  • destination_str προς I_AM_A_DESTINATION_STRING [μέγεθος = 25+1 = 26]

Η συνάρτηση strcpy () θα αντιγράψει και τους 17 χαρακτήρες και τον χαρακτήρα NULL από τη συμβολοσειρά προέλευσης στη συμβολοσειρά προορισμού. Αλλά, δεν θα αντικαταστήσει/αλλάξει τα υπόλοιπα byte (Byte 19 σε 26, ένα με βάση) στον πίνακα προορισμού. Έχουμε χρησιμοποιήσει το βρόχο για επανάληψη στον πίνακα προορισμού και εκτύπωση ολόκληρου του πίνακα για να αποδείξουμε ότι τα byte-19 έως 26 είναι αμετάβλητα στον πίνακα προορισμού. Αυτός είναι ο λόγος για τον οποίο βλέπουμε την τελευταία έξοδο ως:

www.linuxhint.com_STRING Το

#περιλαμβάνω
#περιλαμβάνω


/* Αυτό το πρόγραμμα απεικονίζει την κατάσταση όταν:

μέγεθος συμβολοσειράς προορισμού> μέγεθος συμβολοσειράς προέλευσης

και εκτελούμε τη λειτουργία strcpy () για να αντιγράψουμε το
συμβολοσειρά πηγής στον προορισμό.

Σημείωση: Το μέγεθος της συμβολοσειράς προορισμού πρέπει πάντα
να είναι μεγαλύτερη ή ίση με τη συμβολοσειρά προέλευσης.
* /

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?
απανθρακώνωπροορισμός_στρ[26] = 'I_AM_A_DESTINATION_STRING'?

printf ('Πριν καλέσετε τη λειτουργία strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

strcpy (προορισμός_στρ,πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?


/* εκτύπωση συμβολοσειράς προορισμού με χρήση του βρόχου*/
printf («Εκτύπωση του χαρακτήρα συμβολοσειράς προορισμού με char: n n')?
printf (' tΣειρά προορισμού = ')?

Για(intΕγώ=0?Εγώ<25?Εγώ++)
{
printf ('% c',προορισμός_στρ[Εγώ])?
}
printf (' n n')?

ΕΠΙΣΤΡΟΦΗ 0?
}

strcpy ()-Περίπτωση-3 (παράδειγμα4.γ):

Θεωρήσαμε αυτό το πρόγραμμα ως παράδειγμα για να δείξουμε ότι δεν πρέπει ποτέ να καλούμε το strcpy () με έναν κορμό κυριολεκτικό ως προορισμό. Αυτό θα προκαλέσει απροσδιόριστη συμπεριφορά και τελικά, το πρόγραμμα θα καταρρεύσει.

#περιλαμβάνω
#περιλαμβάνω

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?

printf ('Πριν καλέσετε τη λειτουργία strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?

/* Ποτέ μην καλείτε το strcpy () με συμβολοσειρά κατά λέξη ως προορισμό.
Το πρόγραμμα θα καταρρεύσει.
* /

strcpy ('destination_str',πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας strcpy (): n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

strcpy () - Έκδοση καθορισμένη από το χρήστη (παράδειγμα5.γ):

Σε αυτό το παράδειγμα προγράμματος, έχουμε δείξει πώς να γράψετε μια συνάρτηση strcpy () που καθορίζεται από το χρήστη.

#περιλαμβάνω
απανθρακώνω *strcpy_user_defined(απανθρακώνω *dest, const απανθρακώνω *src)?

/ * Έκδοση καθορισμένη από τη συνάρτηση strcpy () */
απανθρακώνω *strcpy_user_defined(απανθρακώνω *dest, const απανθρακώνω *src)
{
απανθρακώνω *dest_backup=dest?

ενώ(*src! = = ' 0') /* Επαναλάβετε μέχρι να βρεθεί ' 0'.*/
{
*dest= *src? / * Αντιγραφή χαρακτήρα πηγής στον προορισμό */
src++; / * Δείκτης πηγής αύξησης */
dest++; / * Δείκτης προορισμού αύξησης */
}

*dest= ' 0'? /* Εισαγωγή ' 0' στον προορισμό ρητά*/

ΕΠΙΣΤΡΟΦΗdest_backup?
}

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?
απανθρακώνωπροορισμός_στρ[30]?

printf («Πριν καλέσετε τη λειτουργία αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη: n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

/ * Κλήση συνάρτησης αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη */
strcpy_user_defined(προορισμός_στρ,πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη: n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

strcpy () - Βελτιστοποιημένη έκδοση καθορισμένη από το χρήστη (παράδειγμα6.γ):

Τώρα, σε αυτό το παράδειγμα προγράμματος, θα βελτιστοποιήσουμε την έκδοση του strcpy () που ορίζεται από το χρήστη.

#περιλαμβάνω
απανθρακώνω *strcpy_user_defined(απανθρακώνω *dest, const απανθρακώνω *src)?


/ * Βελτιστοποιημένη έκδοση της συνάρτησης strcpy () που καθορίζεται από το χρήστη */
απανθρακώνω *strcpy_user_defined(απανθρακώνω *dest, const απανθρακώνω *src)
{
απανθρακώνω *dest_backup=dest?

ενώ(*dest++ = *src++)
?

ΕΠΙΣΤΡΟΦΗdest_backup?
}

intκύριος()
{
απανθρακώνωπηγή_στρ[] = 'www.linuxhint.com'?
απανθρακώνωπροορισμός_στρ[30]?

printf («Πριν καλέσετε τη λειτουργία αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη: n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

/ * Κλήση συνάρτησης αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη */
strcpy_user_defined(προορισμός_στρ,πηγή_στρ)?

printf (Μετά την εκτέλεση της λειτουργίας αντιγραφής συμβολοσειράς καθορισμένης από το χρήστη: n n')?
printf (' tΣυμβολοσειρά πηγής = %s n',πηγή_στρ)?
printf (' tΣειρά προορισμού = %s n n',προορισμός_στρ)?

ΕΠΙΣΤΡΟΦΗ 0?
}

συμπέρασμα :

Η συνάρτηση strcpy () είναι μια πολύ δημοφιλής και εύχρηστη λειτουργία βιβλιοθήκης για την εκτέλεση της λειτουργίας αντιγραφής συμβολοσειράς στη γλώσσα προγραμματισμού C. Αυτό χρησιμοποιείται κυρίως για την αντιγραφή της συμβολοσειράς από μια θέση σε άλλη τοποθεσία. Ωστόσο, θέλουμε να επαναλάβουμε το γεγονός ότι η συνάρτηση strcpy () δεν κάνει τον έλεγχο ορίων για τον πίνακα προορισμού, ο οποίος θα μπορούσε να οδηγήσει σε σοβαρό σφάλμα λογισμικού εάν αγνοηθεί. Είναι πάντα ευθύνη του προγραμματιστή να βεβαιωθεί ότι ο πίνακας προορισμού έχει αρκετό χώρο για να κρατήσει όλους τους χαρακτήρες από τη συμβολοσειρά προέλευσης, συμπεριλαμβανομένου του χαρακτήρα NULL.