C Συνένωση συμβολοσειρών

C String Concatenation



Η συνένωση είναι η διαδικασία προσθήκης της δεύτερης συμβολοσειράς στο τέλος της πρώτης συμβολοσειράς. Σε αυτό το άρθρο θα συζητήσουμε πώς να συνδυάσουμε συμβολοσειρές στο C χρησιμοποιώντας διαφορετικές μεθόδους.

Η τυπική συνάρτηση βιβλιοθήκης C που χρησιμοποιείται για τη συνένωση συμβολοσειράς είναι strcat ().







Πρωτότυπο λειτουργίας:

$απανθρακώνω * strcat (str1,str2)?

όπου το str1 είναι το πρώτο stringand το str2 είναι το δεύτερο string. Η τιμή επιστροφής της συνάρτησης είναι ο δείκτης στη συνδεδεμένη συμβολοσειρά.



Τώρα, με τη βοήθεια του παραδείγματος, θα δούμε πώς εκτελείται η συγκόλληση.



Παράδειγμα 1:

$ strcat (str1,str2)?
όπου str1 είναι η Bella
Ο str2 είναι ο Whitmann

μετά τη συνένωση της συμβολοσειράς,η πρώτη συμβολοσειρά θα είναι

str1 Bella Whitmann
str2 Whitmann

ενώ το string2 θα παραμείνει ίδιο.





Παράδειγμα 2:

$ strcat (str2,str1)?
όπου str1 είναι η Bella
Ο str2 είναι ο Whitmann

μετά τη συνένωση της συμβολοσειράς,συνδεδεμένη συμβολοσειρά θα είναι

str1 Bella
str2 Bella Whitmann

ενώ η συμβολοσειρά 1 θα παραμείνει η ίδια.

Δήλωση στο αρχείο κεφαλίδας C

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



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

Θα το συζητήσουμε επίσης στις επόμενες ενότητες με παράδειγμα.

Συνένωση δύο συμβολοσειρών χρησιμοποιώντας τη συνάρτηση βιβλιοθήκης C

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

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

#define BUF_SIZE 256
intκύριος()
{
απανθρακώνωS1[BUF_SIZE],S2[BUF_SIZE]? / * Δύο ρυθμιστικά συμβολοσειράς */

printf ('Εισαγάγετε την πρώτη συμβολοσειρά n')? ] /* Εκτύπωση μηνύματος στην κονσόλα για να εισάγει ο χρήστης την 1η συμβολοσειρά*/
fgets (S1,BUF_SIZE,stdin)? / * αποθηκεύστε τη συμβολοσειρά εισόδου χρήστη στο S1 buffer */
S1[ στρλέν (S1)-1] = ' 0'?

printf ('Εισαγάγετε τη δεύτερη συμβολοσειρά n')?/* Εκτύπωση μηνύματος στο χρήστη για εισαγωγή 2ης συμβολοσειράς*/
fgets (S2,BUF_SIZE,stdin)? / * αποθηκεύστε τη συμβολοσειρά εισόδου χρήστη στο S2 buffer */
S2[ στρλέν (S2)-1] = ' 0'?

strcat (S1,S2)? / *Καλέστε την τυπική λειτουργία με συμβολοσειρές S1 και S2 */

printf (' nΗ συνδεδεμένη συμβολοσειρά είναι %s n n',S1)? / *Έξοδος: Το S1 προσαρτάται με το S2 */

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

Στιγμιότυπα του προγράμματος και της εξόδου:

Περιγραφή κειμένου δημιουργείται αυτόματα

Περιγραφή κειμένου δημιουργείται αυτόματα με μέτρια εμπιστοσύνη

Συνένωση δύο συμβολοσειρών χωρίς τη χρήση της λειτουργίας βιβλιοθήκης

Χρησιμοποιώντας το βρόχο για να αντιγράψετε τη δεύτερη συμβολοσειρά στο τέλος της πρώτης συμβολοσειράς.

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

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

#define BUF_SIZE 256
intκύριος()
{
απανθρακώνωS1[BUF_SIZE],S2[BUF_SIZE]? /* Δηλώστε τα buffer S1, S2 και για τη συμβολοσειρά*/
intμήκος= 0,Εγώ,ι? /*Μεταβλητές που απαιτούνται για τη διέλευση βρόχου*/

printf ('Εισαγάγετε την πρώτη συμβολοσειρά')? / * Εκτύπωση μηνύματος χρήστη για εισαγωγή πρώτης συμβολοσειράς */
fgets (S1,BUF_SIZE,stdin)? /* η συμβολοσειρά εισαγωγής χρήστη θα αποθηκευτεί στο S1*/
S1[ στρλέν (S1)-1] = ' 0'?

printf ('Εισαγάγετε τη δεύτερη συμβολοσειρά')? / * Εκτύπωση μηνύματος χρήστη για εισαγωγή Δεύτερης συμβολοσειράς */
fgets (S2,BUF_SIZE,stdin)? /* η συμβολοσειρά εισαγωγής χρήστη θα αποθηκευτεί στο S2*/
S2[ στρλέν (S2)-1] = ' 0'?
/* Διασχίστε την πρώτη συμβολοσειρά για να βρείτε το μήκος του S1*/
Για(Εγώ=0?S1[Εγώ]! = =' 0'?Εγώ++)
{
μήκος=μήκος+1?
}

/*μήκος θα έχει το τέλος του S1, ξεκινήστε από το μήκος και αντιγράψτε ολόκληρο το S2 σε S1*/
Για(Εγώ=μήκος,ι=0?S2[ι]! = =' 0'?Εγώ++,ι++)
{
S1[Εγώ]=S2[ι]?
S1[Εγώ]=' 0'?
}

/ *Εκτύπωση του S1, συνδυασμένο αποτέλεσμα */
printf (' nΗ συνδεδεμένη συμβολοσειρά είναι %s n n',S1)?
ΕΠΙΣΤΡΟΦΗ 0?
}

Στιγμιότυπα του προγράμματος και της εξόδου:

Περιγραφή κειμένου δημιουργείται αυτόματα

Περιγραφή κειμένου δημιουργείται αυτόματα

Ένας άλλος τρόπος χωρίς λειτουργία βιβλιοθήκης

Συνένωση χρησιμοποιώντας αναδρομή:

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

Εάν ο μηδενικός χαρακτήρας δεν έχει εκχωρηθεί στο S2, προσθέστε το στοιχείο S2 στο τέλος του S1 που είναι S1 [i+j] = S2 [j], αυτό αυξάνει την τιμή του i στη συμβολοσειρά.

Μια συνάρτηση θα ονομάζεται μόνη της περνώντας τις μεταρρυθμισμένες συμβολοσειρές (S1, S2) ως όρισμα. Θα καλείται ξανά και ξανά μέχρι να αδειάσει το S2.

Το συνδεδεμένο S1 θα εκτυπωθεί από το main () ως

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

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

#define BUF_SIZE 256

/ * αναδρομική συνάρτηση για την υλοποίηση συνένωσης συμβολοσειράς σύμφωνα με την παραπάνω περιγραφή */
κενόςstringconcatenate(απανθρακώνω *S1,απανθρακώνω *S2)
{
στατικός intΕγώ=0?
στατικός intι?
ι= στρλέν (S1)?
αν(!S2[Εγώ])
{
S2[Εγώ]=' 0'?
}
αλλού
{
S1[ι] =S2[Εγώ]?
S1[ι+1] = ' 0'?
Εγώ++;
stringconcatenate(S1,S2)?
}
}
intκύριος()
{
απανθρακώνωS1[BUF_SIZE],S2[BUF_SIZE]?

printf ('Εισαγάγετε την τιμή της πρώτης συμβολοσειράς:')? / * μήνυμα χρήστη για εισαγωγή 1ης συμβολοσειράς */
fgets (S1,BUF_SIZE,stdin)? / * εισαγωγή πρώτης συμβολοσειράς χρήστη, αποθήκευση στο S1 */
S1[ στρλέν (S1)-1] = ' 0'?

printf ('Εισαγάγετε την τιμή της δεύτερης συμβολοσειράς:')? / * μήνυμα χρήστη για εισαγωγή 2ης συμβολοσειράς */
fgets (S2,BUF_SIZE,stdin)? / * εισαγωγή πρώτης συμβολοσειράς χρήστη, αποθήκευση σε S2 */
S2[ στρλέν (S2)-1] = ' 0'?

stringconcatenate(S1,S2)? / * Καλέστε τη συνάρτηση με S1, S2 ως παραμέτρους */

printf ('συνδυασμός συμβολοσειρών ='%s ' n',S1)?
ΕΠΙΣΤΡΟΦΗ 0?
}

Στιγμιότυπα του προγράμματος και της εξόδου:

Περιγραφή κειμένου δημιουργείται αυτόματα

Περιγραφή κειμένου δημιουργείται αυτόματα

Συνένωση με τη χρήση λειτουργιών

Η συνάρτηση strconcatenate () καλείται από το main () για να συνδυάσει δύο συμβολοσειρές.

Η συνάρτηση παίρνει το μήκος της συμβολοσειράς 1 χρησιμοποιώντας stringlen (string1).

Προσθέστε τα στοιχεία της συμβολοσειράς2 [i] στη συμβολοσειρά1 [i+j]. Αυτό το βήμα θα επαναληφθεί μέχρι να αδειάσει η συμβολοσειρά. Εδώ, συνδέουμε το string2 με το string1 στο τέλος του string1.

Η συνδεδεμένη συμβολοσειρά (συμβολοσειρά 1) θα ληφθεί μέχρι το τέλος όταν εκτελεστούν όλες οι επαναλήψεις του βρόχου for.

Η κύρια () εκτυπώνει τη συνδεδεμένη συμβολοσειρά S1

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

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

#define BUF_SIZE 256

/ * συνάρτηση για την υλοποίηση συνένωσης συμβολοσειράς σύμφωνα με την παραπάνω περιγραφή */
κενόςstrconcatenate(απανθρακώνω *χορδή 1, απανθρακώνω*χορδή 2)
{
intΕγώ?
intι= στρλέν (χορδή 1)?
Για(Εγώ=0?σειρά2[Εγώ]?Εγώ++)
{
χορδή 1[Εγώ+ι]=χορδή 2[Εγώ]?
}
χορδή 1[Εγώ+ι]= ' 0'?
}
intκύριος()
{
απανθρακώνωχορδή 1[BUF_SIZE],χορδή 2[BUF_SIZE]?
printf ('Εισαγάγετε την πρώτη συμβολοσειρά:')? / * Μήνυμα χρήστη για την 1η συμβολοσειρά */
fgets (χορδή 1,BUF_SIZE,stdin)? / * Δεύτερη συμβολοσειρά εισαγωγής χρήστη, αποθηκευμένη στη συμβολοσειρά 1 */
χορδή 1[ στρλέν (χορδή 1)-1] = ' 0'?

printf ('Εισαγάγετε τη δεύτερη συμβολοσειρά:')? / * Μήνυμα χρήστη για 2η συμβολοσειρά */
fgets (χορδή 2,BUF_SIZE,stdin)? / * Δεύτερη συμβολοσειρά εισαγωγής χρήστη, αποθηκευμένη στη συμβολοσειρά2 */
χορδή 2[ στρλέν (χορδή 2)-1] = ' 0'?

strconcatenate(χορδή 1,χορδή 2)? /* Καλέστε τη συνάρτηση με string1 και string2 ως ορίσματα*/

printf ('Αποτέλεσμα συμβολοσειράς = %s' n',χορδή 1)?
ΕΠΙΣΤΡΟΦΗ 0?
}

Στιγμιότυπα του προγράμματος και της εξόδου:

Περιγραφή κειμένου δημιουργείται αυτόματα

Περιγραφή κειμένου δημιουργείται αυτόματα

Συνένωση συμβολοσειράς με χρήση memcpy

Χρησιμοποιώντας τη συνάρτηση memcpy (), η συνένωση της συμβολοσειράς γίνεται αντιγράφοντας λέξη προς λέξη από ένα buffer συμβολοσειράς στο τέλος ενός άλλου buffer συμβολοσειράς, όπου το μέγεθος της λέξης είναι 4 byte, λαμβάνοντας υπόψη ότι τρέχουμε σε μηχανή 32 bit, ενώ όταν κάνουμε συνένωση συμβολοσειράς από χρησιμοποιώντας τη συνένωση συμβολοσειράς χρησιμοποιώντας τη συνάρτηση strcat (), η συνένωση γίνεται με αντιγραφή byte byte από ένα buffer συμβολοσειράς σε άλλο buffer συμβολοσειράς.

Αυτή η προσέγγιση είναι αποδοτική στην απόδοση.

Το μόνο που πρέπει να λάβετε υπόψη κατά τη χρήση του memcpy είναι να φροντίσετε το ' 0'.

Πρόγραμμα C για την επίτευξη του strcat με memcpy:

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

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

#define BUF_SIZE 256

Κενό strcat_memcpy(απανθρακώνω *S1, απανθρακώνω *S2)
{
intμήκος 1,μήκος2?
μήκος 1= στρλέν (S1)?
μήκος2= στρλέν (S2)?
memcpy (S1+μήκος 1,S2,μήκος2)?
}
intκύριος()
{

απανθρακώνωχορδή 1[BUF_SIZE],χορδή 2[BUF_SIZE]?
printf ('Εισαγάγετε την πρώτη συμβολοσειρά:')? / * Μήνυμα χρήστη για την 1η συμβολοσειρά */
fgets (χορδή 1,BUF_SIZE,stdin)? / * Δεύτερη συμβολοσειρά εισαγωγής χρήστη, αποθηκευμένη στη συμβολοσειρά 1 */
χορδή 1[ στρλέν (χορδή 1)-1] = ' 0'?

printf ('Εισαγάγετε τη δεύτερη συμβολοσειρά:')? / * Μήνυμα χρήστη για 2η συμβολοσειρά */
fgets (χορδή 2,BUF_SIZE,stdin)? / * Δεύτερη συμβολοσειρά εισαγωγής χρήστη, αποθηκευμένη στη συμβολοσειρά2 */
χορδή 2[ στρλέν (χορδή 2)-1] = ' 0'?

strcat_memcpy(χορδή 1,χορδή 2)? /* Καλέστε τη συνάρτηση με string1 και string2 ως ορίσματα*/

printf ('Αποτέλεσμα συμβολοσειράς = %s' n',χορδή 1)?
ΕΠΙΣΤΡΟΦΗ 0?


}

Στιγμιότυπα του προγράμματος και της εξόδου:

Περιγραφή κειμένου δημιουργείται αυτόματα

Περιγραφή κειμένου δημιουργείται αυτόματα

Συμπέρασμα:

Με όλη αυτή τη συζήτηση μπορούμε να ολοκληρώσουμε τη συνένωση συμβολοσειρών στο C. Έχουμε δει πολλά παραδείγματα και δείγματα προγραμμάτων για συνένωση συμβολοσειρών. Θα υπενθυμίσουμε τα κύρια στοιχεία: Υπάρχουν δύο τρόποι, ένας με το πρότυπο C και ο άλλος ορίζεται από τον χρήστη. Ο καθορισμένος από τον χρήστη μπορεί περαιτέρω να είναι πολλών τύπων, εξαρτάται από το πώς ο χρήστης θέλει να εφαρμόσει τη συνένωση συμβολοσειράς.