Πράξεις C με συμβολοσειρά. Χορδές σε C. Εισαγωγή
Σε ένα πρόγραμμα, οι συμβολοσειρές μπορούν να οριστούν ως εξής:
- ως σταθερές συμβολοσειράς.
- ως πίνακες χαρακτήρων?
- μέσω ενός δείκτη σε έναν τύπο χαρακτήρα.
- σαν συστοιχίες χορδών.
Επιπλέον, πρέπει να παρέχεται εκχώρηση μνήμης για την αποθήκευση της συμβολοσειράς.
Οποιαδήποτε ακολουθία χαρακτήρων που περικλείεται σε διπλά εισαγωγικά "" αντιμετωπίζεται ως σταθερά χορδής.
Για σωστή έξοδο, οποιαδήποτε συμβολοσειρά πρέπει να τελειώνει με τον μηδενικό χαρακτήρα "\0", η ακέραια τιμή του οποίου είναι 0. Όταν δηλώνετε μια συμβολοσειρά σταθερή, ο μηδενικός χαρακτήρας προστίθεται αυτόματα σε αυτήν. Έτσι, μια ακολουθία χαρακτήρων, η οποία είναι μια σταθερά συμβολοσειράς, θα τοποθετηθεί στη μνήμη RAM του υπολογιστή, συμπεριλαμβανομένου του μηδενικού byte.
Διαδοχικά κελιά RAM εκχωρούνται για την αποθήκευση της συμβολοσειράς. Άρα μια συμβολοσειρά είναι μια σειρά χαρακτήρων. Εκχωρείται 1 byte για την αποθήκευση του κώδικα κάθε χαρακτήρα στη συμβολοσειρά.
Για να τοποθετηθούν ορισμένοι χαρακτήρες υπηρεσίας σε μια σταθερά συμβολοσειράς, χρησιμοποιούνται συνδυασμοί χαρακτήρων. Επομένως, εάν χρειάζεται να συμπεριλάβετε έναν χαρακτήρα διπλού εισαγωγικού σε μια συμβολοσειρά, πρέπει να προηγείται ένας χαρακτήρας ανάστροφης κάθετο: ‘\”’ .
Οι σταθερές συμβολοσειράς βρίσκονται στη στατική μνήμη. Η αρχική διεύθυνση μιας ακολουθίας χαρακτήρων σε διπλά εισαγωγικά αντιμετωπίζεται ως διεύθυνση μιας συμβολοσειράς. Οι σταθερές συμβολοσειράς χρησιμοποιούνται συχνά για να παρέχουν αλληλεπίδραση χρήστη σε συναρτήσεις όπως η printf().
Κατά τον καθορισμό πίνακας χαρακτήρωνπρέπει να πείτε στον μεταγλωττιστή το απαιτούμενο μέγεθος μνήμης.
char m;
Ο μεταγλωττιστής μπορεί επίσης να προσδιορίσει ανεξάρτητα το μέγεθος του πίνακα χαρακτήρων εάν η αρχικοποίηση του πίνακα καθορίζεται όταν δηλώνεται ως σταθερά συμβολοσειράς:
char m2=;
char m3=( "T", "i", "x", "i", "e", ", "d", "o", "l", "i", "n", "s", ", "p ", "o", "l", "n", "y", ", "s", "v", "e", "zh", "e", "y", ", "m", "g", "l", "o", "y", "\0"};
Σε αυτήν την περίπτωση, τα ονόματα m2 και m3 είναι δείκτες στα πρώτα στοιχεία των πινάκων:
- m2 ισοδυναμεί με &m2
- m2 ισοδυναμεί με "G"
- m2 ισοδυναμεί με "o"
- m3 ισοδυναμεί με &m3
- m3 ισοδυναμεί με 'x'
Όταν δηλώνετε έναν πίνακα χαρακτήρων και τον αρχικοποιείτε με μια σταθερά συμβολοσειράς, μπορείτε να καθορίσετε ρητά το μέγεθος του πίνακα, αλλά το καθορισμένο μέγεθος πίνακα πρέπει να είναι μεγαλύτερο από το μέγεθος της σταθεράς συμβολοσειράς αρχικοποίησης:
char m2= «Οι βουνοκορφές κοιμούνται στο σκοτάδι της νύχτας».;
Για να ορίσετε μια συμβολοσειρά μπορείτε να χρησιμοποιήσετε δείκτη προς τον τύπο χαρακτήρα.
char *m4;
Σε αυτήν την περίπτωση, κατά τη δήλωση ενός πίνακα, στη μεταβλητή m4 μπορεί να εκχωρηθεί η διεύθυνση του πίνακα:
m4 = m3;
*m4 ισοδυναμεί με m3="T"
*(m4+1) ισοδυναμεί με m3="and"
Εδώ το m3 είναι μια σταθερά δείκτη. Δεν μπορείτε να αλλάξετε το m3, καθώς αυτό θα σήμαινε αλλαγή της θέσης (διεύθυνσης) του πίνακα στη μνήμη, σε αντίθεση με το m4.
Για έναν δείκτη, μπορείτε να χρησιμοποιήσετε τη λειτουργία αύξησης (μεταβείτε στον επόμενο χαρακτήρα):
Πίνακες συμβολοσειρών χαρακτήρων
Μερικές φορές τα προγράμματα χρειάζονται περιγραφή σειρά από συμβολοσειρές χαρακτήρων. Σε αυτήν την περίπτωση, μπορείτε να χρησιμοποιήσετε το ευρετήριο γραμμών για πρόσβαση σε πολλές διαφορετικές σειρές.
χαρ *ποιητής = ( "Ο ποιητής πέθανε!", "- ένας σκλάβος της τιμής -",
"Έπεσε", "συκοφαντήθηκε από φήμες..."};
Σε αυτήν την περίπτωση, ο ποιητής είναι ένας πίνακας που αποτελείται από τέσσερις δείκτες σε συμβολοσειρές χαρακτήρων. Κάθε συμβολοσειρά χαρακτήρων είναι ένας πίνακας χαρακτήρων, επομένως υπάρχουν τέσσερις δείκτες πίνακα. Ο δείκτης ποιητής αναφέρεται στην πρώτη γραμμή:
*ποιητήςισοδύναμος "Π",
*ποιητής[l]ισοδύναμος "-"
.
Η αρχικοποίηση εκτελείται σύμφωνα με τους κανόνες που ορίζονται για τους πίνακες.
Τα εισηγμένα κείμενα ισοδυναμούν με την προετοιμασία κάθε συμβολοσειράς στον πίνακα. Ένα κόμμα χωρίζει δίπλα
ακολουθίες.
Μπορείτε επίσης να ορίσετε ρητά το μέγεθος των συμβολοσειρών χαρακτήρων χρησιμοποιώντας μια περιγραφή όπως αυτή:
char ποιητής?
Η διαφορά είναι ότι αυτή η φόρμα ορίζει έναν "ορθογώνιο" πίνακα στον οποίο όλες οι σειρές έχουν το ίδιο μήκος.
Δωρεάν συστοιχία
Περιγραφή
char *poet;
ορίζει έναν ελεύθερο πίνακα, όπου το μήκος κάθε γραμμής καθορίζεται από τον δείκτη που αρχικοποιεί αυτή τη γραμμή. Μια ελεύθερη συστοιχία δεν σπαταλά τη μνήμη.
Λειτουργίες συμβολοσειρών
Οι περισσότερες πράξεις C που ασχολούνται με συμβολοσειρές λειτουργούν με δείκτες. Για να τοποθετήσετε μια σειρά χαρακτήρων στη μνήμη RAM, πρέπει:
- να διαθέσει ένα μπλοκ μνήμης RAM για τον πίνακα.
- αρχικοποιήστε τη συμβολοσειρά.
Για την εκχώρηση μνήμης για την αποθήκευση μιας συμβολοσειράς, μπορούν να χρησιμοποιηθούν συναρτήσεις δυναμικής εκχώρησης μνήμης. Σε αυτήν την περίπτωση, είναι απαραίτητο να ληφθεί υπόψη το απαιτούμενο μέγεθος γραμμής:
όνομα χαρακτήρα;
όνομα = (char *)malloc(10);
scanf("%9s" , όνομα);
Η συνάρτηση scanf() χρησιμοποιείται για την εισαγωγή μιας συμβολοσειράς και η συμβολοσειρά που εισάγεται δεν μπορεί να υπερβαίνει τους 9 χαρακτήρες. Ο τελευταίος χαρακτήρας θα περιέχει "\0" .
Λειτουργίες εισαγωγής συμβολοσειράς
Η συνάρτηση scanf() μπορεί να χρησιμοποιηθεί για την εισαγωγή μιας συμβολοσειράς. Ωστόσο, η scanf() έχει σχεδιαστεί για να ανακτά μια λέξη αντί για μια συμβολοσειρά. Εάν χρησιμοποιείτε τη μορφή "%s" για εισαγωγή, η γραμμή εισάγεται πριν (αλλά δεν περιλαμβάνει) τον επόμενο κενό χαρακτήρα, ο οποίος μπορεί να είναι κενό, καρτέλα ή νέα γραμμή.
Για να εισαγάγετε μια συμβολοσειρά, συμπεριλαμβανομένων των διαστημάτων, χρησιμοποιήστε τη συνάρτηση
char * παίρνει (char *);
ή το αντίστοιχο
char * gets_s(char *);
Ένας δείκτης στη συμβολοσειρά που θα εισαχθεί μεταβιβάζεται ως όρισμα στη συνάρτηση. Η συνάρτηση ζητά από το χρήστη να εισαγάγει μια συμβολοσειρά, την οποία τοποθετεί σε έναν πίνακα μέχρι να πατήσει ο χρήστης Εισαγω.
Λειτουργίες εξόδου συμβολοσειράς
Για την έξοδο συμβολοσειρών, μπορείτε να χρησιμοποιήσετε τη συνάρτηση που συζητήσαμε προηγουμένως
printf("%s" , str); // str - δείκτης σε συμβολοσειρά
ή σε συντομευμένη μορφή
printf(str);
Η συνάρτηση μπορεί επίσης να χρησιμοποιηθεί για την έξοδο συμβολοσειρών
int puts (char *s);
που εκτυπώνει τη συμβολοσειρά s και μετακινεί τον κέρσορα σε νέα γραμμή (σε αντίθεση με την printf() ). Η συνάρτηση puts() μπορεί επίσης να χρησιμοποιηθεί για την έξοδο σταθερών συμβολοσειρών που περικλείονται σε εισαγωγικά.
Λειτουργία εισαγωγής χαρακτήρων
Η συνάρτηση μπορεί να χρησιμοποιηθεί για την εισαγωγή χαρακτήρων
char getchar();
που επιστρέφει την τιμή του χαρακτήρα που εισάγεται από το πληκτρολόγιο. Αυτή η λειτουργία χρησιμοποιήθηκε στα παραδείγματα που συζητήθηκαν προηγουμένως για να καθυστερήσει το παράθυρο της κονσόλας μετά την εκτέλεση του προγράμματος μέχρι να πατηθεί ένα πλήκτρο.
Λειτουργία εξόδου χαρακτήρων
Η συνάρτηση μπορεί να χρησιμοποιηθεί για την έξοδο χαρακτήρων
char putchar(char);
που επιστρέφει την τιμή του χαρακτήρα που θα εκτυπωθεί και εκτυπώνει τον χαρακτήρα που μεταβιβάστηκε ως όρισμα στην οθόνη.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
int main() (
char s, sym;
int count, i;
system("chcp 1251" );
system("cls" );
printf( "Εισαγάγετε τη συμβολοσειρά:");
gets_s(s);
printf( "Εισαγωγή χαρακτήρα:");
sym = getchar();
καταμέτρηση = 0;
για (i = 0; s[i] != "\0" ; i++)
{
αν (s[i] == sym)
count++;
}
printf("Σε γραμμή\n" );
βάζει(ες); // Έξοδος μιας συμβολοσειράς
printf("χαρακτήρας" );
putchar(sym); // Έξοδος του συμβόλου
printf( "συμβαίνει %d φορές", μετρώ);
getchar(); getchar();
επιστροφή 0;
}
Αποτέλεσμα εκτέλεσης
Κύριες λειτουργίες της τυπικής συμβολοσειράς βιβλιοθήκης.h
Οι κύριες συναρτήσεις της τυπικής συμβολοσειράς βιβλιοθήκης.h δίνονται στον πίνακα.
Λειτουργία | Περιγραφή |
char *strcat(char *s1, char *s2) |
προσθέτει το s2 στο s1, επιστρέφει το s1 |
char *strncat(char *s1, char *s2, int n) |
προσθέτει το πολύ n χαρακτήρες s2 στο s1, τελειώνει τη συμβολοσειρά με "\0", επιστρέφει s1 |
char *strсpy(char *s1, char *s2) |
αντιγράφει τη συμβολοσειρά s2 στη συμβολοσειρά s1, συμπεριλαμβανομένου του "\0", επιστρέφει το s1 |
); strncpy(m3, m1, 6); // δεν προσθέτει "\0" στο τέλος της γραμμής βάζει( "Αποτέλεσμα strncpy(m3, m1, 6)"); puts(m3); strcpy(m3, m1); βάζει( "Αποτέλεσμα strcpy(m3, m1)"); puts(m3); βάζει( "Το αποτέλεσμα του strcmp(m3, m1) είναι"); printf("%d" , strcmp(m3, m1)); strncat(m3, m2, 5); βάζει( "Αποτέλεσμα strncat(m3, m2, 5)"); puts(m3); strcat(m3, m2); βάζει( "Αποτέλεσμα strcat(m3, m2)"); puts(m3); βάζει( "Ο αριθμός των χαρακτήρων στη συμβολοσειρά m1 είναι strlen(m1) : "); printf("%d\n" , strlen(m1)); _strnset(m3, "f" , 7); βάζει( "Αποτέλεσμα strnset(m3, "f" , 7)"); puts(m3); _strset(m3, "k" ); βάζει( "Αποτέλεσμα strnset(m3, "k" )"); puts(m3); getchar(); επιστροφή 0; } Αποτέλεσμα εκτέλεσης |
Ετικέτες: Γ γραμμές. Συστοιχία χαρακτήρων.
Χορδές σε C. Εισαγωγή.
Αυτό είναι ένα εισαγωγικό άρθρο για τις χορδές C. Μια πιο λεπτομερής περιγραφή και παραδείγματα θα έρθουν όταν μάθουμε πώς να εργαζόμαστε με τη μνήμη και τους δείκτες. Σε έναν υπολογιστή, όλες οι τιμές αποθηκεύονται ως αριθμοί. Και γραμμές επίσης, δεν υπάρχουν σύμβολα ή γράμματα εκεί. Ένας όρος είναι ένας πίνακας αριθμών. Κάθε αριθμός αντιστοιχεί σε έναν συγκεκριμένο χαρακτήρα, ο οποίος λαμβάνεται από τον πίνακα κωδικοποίησης. Όταν εμφανίζεται στην οθόνη, το σύμβολο εμφανίζεται με συγκεκριμένο τρόπο.
Πίνακες του τύπου char χρησιμοποιούνται για την αποθήκευση συμβολοσειρών. Επαναλαμβάνω για άλλη μια φορά - ο τύπος χαρακτήρων είναι αριθμητικός, αποθηκεύει ένα byte δεδομένων. Αλλά σύμφωνα με τον πίνακα κωδικοποίησης, καθένας από αυτούς τους αριθμούς σχετίζεται με έναν χαρακτήρα. Και προς την αντίθετη κατεύθυνση - κάθε χαρακτήρας καθορίζεται από τον αύξοντα αριθμό του στον πίνακα κωδικοποίησης.
Για παράδειγμα
#περιλαμβάνω
Δημιουργήσαμε δύο μεταβλητές, μία τύπου απανθρακώνω, άλλα ενθ. Το γράμμα "Α" έχει αριθμητική τιμή 65. Είναι γράμμα, όχι συμβολοσειρά, και επομένως περιβάλλεται από μονά εισαγωγικά. Μπορούμε να το εκτυπώσουμε ως γράμμα
Printf("εμφάνιση ως χαρακτήρα %c\n", c);
Στη συνέχεια θα βγει στην έξοδο
ΕΝΑ
Εάν το βγάλετε ως αριθμό, θα είναι
65
Μπορείτε να κάνετε το ίδιο με τον αριθμό 65, ο οποίος είναι αποθηκευμένος σε μια μεταβλητή όπως ενθ.
Οι ειδικοί χαρακτήρες έχουν επίσης τον δικό τους αριθμό
#περιλαμβάνω
Εδώ θα «εξάγεται» πρώτα το ηχητικό σήμα, μετά η αριθμητική του τιμή και μετά πάλι το ηχητικό σήμα.
Μια συμβολοσειρά στο C είναι ένας πίνακας τύπου απανθρακώνω, το τελευταίο στοιχείο του οποίου αποθηκεύει τον τερματικό χαρακτήρα "\0". Η αριθμητική τιμή αυτού του χαρακτήρα είναι 0, οπότε μπορούμε να πούμε ότι ο πίνακας τελειώνει με μηδέν.
Για παράδειγμα
#περιλαμβάνω
Το κλειδί %s χρησιμοποιήθηκε για έξοδο. Σε αυτήν την περίπτωση, η γραμμή εκτυπώνεται μέχρι τον πρώτο τερματικό χαρακτήρα, επειδή η συνάρτηση printf δεν γνωρίζει το μέγεθος του πίνακα λέξεων.
Αν σε αυτό το παράδειγμα δεν βάλετε
Word = "\0";
τότε θα βγει μια συμβολοσειρά χαρακτήρων αυθαίρετου μήκους μέχρι να συναντηθεί το πρώτο byte γεμάτο με μηδενικά.
#περιλαμβάνω
Σε αυτή την περίπτωση, όλα είναι σωστά. Η συμβολοσειρά "ABC" τελειώνει σε μηδέν και αρχικοποιούμε τον πίνακα λέξεων με αυτήν. Η συμβολοσειρά κειμένου αρχικοποιείται γράμμα προς γράμμα, όλοι οι υπόλοιποι χαρακτήρες, όπως προκύπτει από το κεφάλαιο για τους πίνακες, είναι γεμάτοι με μηδενικά.
Διαβάζοντας γραμμές
Για να ζητήσετε μια συμβολοσειρά από τον χρήστη, πρέπει να δημιουργήσετε ένα buffer. Το μέγεθος της προσωρινής μνήμης πρέπει να επιλεγεί εκ των προτέρων, έτσι ώστε η εισαγόμενη λέξη να ταιριάζει σε αυτό. Κατά την ανάγνωση γραμμών, υπάρχει ο κίνδυνος ο χρήστης να εισάγει περισσότερα δεδομένα από όσα επιτρέπει η προσωρινή μνήμη. Αυτά τα δεδομένα θα διαβαστούν και θα τοποθετηθούν στη μνήμη και θα αντικαταστήσουν τις τιμές άλλων ανθρώπων. Με αυτόν τον τρόπο, μπορείτε να πραγματοποιήσετε μια επίθεση καταγράφοντας τα απαραίτητα byte, στα οποία, για παράδειγμα, αξίζει να μεταβείτε σε μια ενότητα κώδικα με ένα κακόβουλο πρόγραμμα ή να καταγράψετε δεδομένα.
#περιλαμβάνω
Σε αυτήν την περίπτωση, ο αριθμός των χαρακτήρων που εισάγονται περιορίζεται σε 19 και το μέγεθος του buffer είναι 1 μεγαλύτερο, καθώς είναι απαραίτητο να αποθηκεύσετε τον τερματικό χαρακτήρα. Ας γράψουμε ένα απλό πρόγραμμα που ζητά από τον χρήστη μια συμβολοσειρά και επιστρέφει το μήκος της.
#περιλαμβάνω
Δεδομένου ότι η αριθμητική τιμή του χαρακτήρα "\0" είναι μηδέν, μπορούμε να γράψουμε
Ενώ (buffer != 0) (len++; )
Ή, ακόμα πιο κοντό
Ενώ (buffer) (len++; )
Τώρα ας γράψουμε ένα πρόγραμμα που ζητά από τον χρήστη δύο λέξεις και τις συγκρίνει
#περιλαμβάνω
Δεδομένου ότι κάθε γράμμα έχει μια αριθμητική αξία, μπορούν να συγκριθούν μεταξύ τους ως αριθμοί. Επιπλέον, συνήθως (αλλά όχι πάντα!) τα γράμματα στους πίνακες κωδικοποίησης ταξινομούνται αλφαβητικά. Επομένως, η ταξινόμηση κατά αριθμητική τιμή θα είναι επίσης αλφαβητική.
Το σύγχρονο πρότυπο C++ ορίζει μια κλάση με συναρτήσεις και ιδιότητες (μεταβλητές) για την οργάνωση της εργασίας με συμβολοσειρές (στην κλασική γλώσσα C δεν υπάρχουν συμβολοσειρές ως τέτοιες, υπάρχουν μόνο πίνακες χαρακτήρων χαρακτήρων):
#περιλαμβάνω
#περιλαμβάνω#περιλαμβάνω
Για να εργαστείτε με συμβολοσειρές, πρέπει επίσης να συνδέσετε έναν τυπικό χώρο ονομάτων:
Χρήση χώρου ονομάτων std;
Διαφορετικά, θα πρέπει να καθορίσετε τον περιγραφέα κλάσης std::string παντού αντί για συμβολοσειρά .
Παρακάτω είναι ένα παράδειγμα προγράμματος που λειτουργεί με συμβολοσειρά (δεν λειτουργεί σε παλαιότερους μεταγλωττιστές συμβατούς με C!):
#περιλαμβάνω
Τα κύρια χαρακτηριστικά που έχει η κλάση χορδών:
- προετοιμασία με μια σειρά χαρακτήρων (ενσωματωμένος τύπος συμβολοσειράς) ή άλλο αντικείμενο τύπου string . Ένας ενσωματωμένος τύπος δεν έχει τη δεύτερη δυνατότητα.
- αντιγραφή μιας γραμμής στην άλλη. Για έναν ενσωματωμένο τύπο πρέπει να χρησιμοποιήσετε τη συνάρτηση strcpy().
- πρόσβαση σε μεμονωμένους χαρακτήρες μιας συμβολοσειράς για ανάγνωση και γραφή. Σε έναν ενσωματωμένο πίνακα, αυτό γίνεται χρησιμοποιώντας μια λειτουργία ευρετηρίου ή έμμεση διευθυνσιοδότηση χρησιμοποιώντας έναν δείκτη.
- συγκρίνοντας δύο χορδές για ισότητα. Για έναν ενσωματωμένο τύπο, χρησιμοποιούνται οι συναρτήσεις της οικογένειας strcmp().
- συνένωση (σύνδεση) δύο χορδών, παράγοντας το αποτέλεσμα είτε ως τρίτη χορδή είτε αντί μιας από τις αρχικές. Για έναν ενσωματωμένο τύπο, χρησιμοποιείται η συνάρτηση strcat(), αλλά για να λάβετε το αποτέλεσμα σε μια νέα γραμμή, πρέπει να χρησιμοποιήσετε τις συναρτήσεις strcpy() και strcat() διαδοχικά και επίσης να φροντίσετε την εκχώρηση μνήμης.
- ενσωματωμένα μέσα για τον προσδιορισμό του μήκους μιας συμβολοσειράς (συναρτήσεις μέλους τάξης size() και l ength()). Ο μόνος τρόπος για να μάθετε το μήκος μιας συμβολοσειράς ενσωματωμένου τύπου είναι να το υπολογίσετε χρησιμοποιώντας τη συνάρτηση strlen().
- ικανότητα να ανακαλύψετε εάν μια συμβολοσειρά είναι κενή.
Ας δούμε αυτά τα βασικά χαρακτηριστικά με περισσότερες λεπτομέρειες.
Αρχικοποίηση συμβολοσειρώνόταν περιγράφει και μήκος χορδής(μη συμπεριλαμβανομένου του τερματισμού null terminator):
String st("Η συμβολοσειρά μου\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
Η συμβολοσειρά μπορεί επίσης να είναι κενή:
String st2;
Για να το ελέγξω είναι κενή η γραμμή, μπορείτε να συγκρίνετε το μήκος του με 0:
Αν (! st.size()) // κενό
ή χρησιμοποιήστε τη μέθοδο vala(), η οποία επιστρέφει true για μια κενή συμβολοσειρά και false για μια μη κενή συμβολοσειρά:
Αν (st.empty()) // κενό
Η τρίτη μορφή δημιουργίας συμβολοσειράς αρχικοποιεί ένα αντικείμενο τύπου string με ένα άλλο αντικείμενο του ίδιου τύπου:
Συμβολοσειρά st3(st);
Η συμβολοσειρά st3 αρχικοποιείται με τη συμβολοσειρά st . Πώς μπορούμε να τα βεβαιώσουμε αυτά οι γραμμές ταιριάζουν? Ας χρησιμοποιήσουμε τον τελεστή σύγκρισης (==):
Αν (st == st3) // η προετοιμασία λειτούργησε
Πως αντιγράψτε τη μια γραμμή στην άλλη? Χρησιμοποιώντας τον κανονικό τελεστή εκχώρησης:
St2 = st3; // αντιγράψτε το st3 στο st2
Για συνένωση χορδώνχρησιμοποιείται ο τελεστής πρόσθεσης (+) ή ο τελεστής προσθήκης συν εκχώρησης (+=). Ας δοθούν δύο γραμμές:
Συμβολοσειρά s1("γεια, "); string s2("world\n");
Μπορούμε να πάρουμε μια τρίτη συμβολοσειρά που αποτελείται από μια συνένωση των δύο πρώτων, ως εξής:
Συμβολοσειρά s3 = s1 + s2;
Αν θέλουμε να προσθέσουμε s2 στο τέλος του s1, θα πρέπει να γράψουμε:
S1 += s2;
Η λειτουργία πρόσθεσης μπορεί να συνδέσει αντικείμενα κλάσης σειράόχι μόνο μεταξύ τους, αλλά και με ενσωματωμένες χορδές τύπου. Μπορείτε να ξαναγράψετε το παραπάνω παράδειγμα έτσι ώστε οι ειδικοί χαρακτήρες και τα σημεία στίξης να αντιπροσωπεύονται από τον ενσωματωμένο τύπο char * και οι σημαντικές λέξεις να αντιπροσωπεύονται από αντικείμενα της συμβολοσειράς κλάσης:
Const char *pc = ", "; string s1("γεια"); string s2("world"); συμβολοσειρά s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;
Τέτοιες εκφράσεις λειτουργούν επειδή ο μεταγλωττιστής "ξέρει" πώς να μετατρέπει αυτόματα αντικείμενα του ενσωματωμένου τύπου σε αντικείμενα της κλάσης συμβολοσειράς. Είναι επίσης δυνατό να αντιστοιχίσετε απλώς μια ενσωματωμένη συμβολοσειρά σε ένα αντικείμενο συμβολοσειράς:
Συμβολοσειρά s1; const char *pc = "ένας πίνακας χαρακτήρων"; s1 = pc; // Σωστά
Ο αντίστροφος μετασχηματισμός σε αυτή την περίπτωση δεν δουλεύει. Η προσπάθεια εκτέλεσης της ακόλουθης αρχικοποίησης συμβολοσειράς ενσωματωμένου τύπου θα προκαλέσει σφάλμα μεταγλώττισης:
Char *str = s1; // σφάλμα μεταγλώττισης
Για να εκτελέσετε αυτήν τη μετατροπή, πρέπει να καλέσετε ρητά μια συνάρτηση μέλους που ονομάζεται c_str() ("συμβολοσειρά C"):
Const char *str = s1.c_str();
Η συνάρτηση c_str() επιστρέφει έναν δείκτη σε έναν πίνακα χαρακτήρων που περιέχει τη συμβολοσειρά του αντικειμένου συμβολοσειράς όπως θα εμφανιζόταν στον ενσωματωμένο τύπο συμβολοσειράς. Η λέξη-κλειδί const εδώ αποτρέπει την "επικίνδυνη" δυνατότητα στα σύγχρονα οπτικά περιβάλλοντα άμεσης τροποποίησης των περιεχομένων ενός αντικειμένου μέσω ενός δείκτη.
ΠΡΟΣ ΤΗΝ μεμονωμένους χαρακτήρεςΈνα αντικείμενο τύπου string , όπως ένας ενσωματωμένος τύπος, μπορεί να προσπελαστεί χρησιμοποιώντας τη λειτουργία ευρετηρίου. Για παράδειγμα, εδώ είναι ένα κομμάτι κώδικα που αντικαθιστά όλες τις τελείες με υπογράμμιση:
String str("www.disney.com"); int size = str.size(); για (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Replace(str.begin(), str.end(), ".", "_");
Είναι αλήθεια ότι εδώ δεν χρησιμοποιείται η μέθοδος αντικατάστασης της κλάσης συμβολοσειράς, αλλά ο αλγόριθμος με το ίδιο όνομα:
#περιλαμβάνω
Επειδή το αντικείμενο συμβολοσειράς συμπεριφέρεται σαν κοντέινερ, μπορούν να εφαρμοστούν άλλοι αλγόριθμοι σε αυτό. Αυτό σας επιτρέπει να επιλύετε προβλήματα που δεν επιλύονται άμεσα από τις συναρτήσεις της κλάσης συμβολοσειράς.
Παρακάτω είναι μια σύντομη περιγραφή των κύριων τελεστών και των λειτουργιών της κλάσης συμβολοσειρών στον πίνακα που οδηγούν σε περιγραφές στη ρωσική γλώσσα στο Διαδίκτυο. Μια πιο πλήρης λίστα με τις δυνατότητες της κλάσης συμβολοσειρών μπορεί να βρεθεί, για παράδειγμα, στη Wikipedia ή στον ιστότοπο cplusplus.com.