User Tools

Site Tools


cpp:strings

This is an old revision of the document!


Αλφαριθμητικά

Τα αλφαριθμητικά μπορούν να αναπαρασταθούν με δύο τρόπους

  1. Μέσω μιας ακολουθίας χαρακτήρων που περιέχει το χαρακτήρα '\0' στο τέλος.
  2. Μέσω της κλάσης string.

Aκολουθία χαρακτήρων που περιέχει το χαρακτήρα '\0' στο τέλος

char str[12] = "Hello";

ή

char str[12] = { 'H', 'e', 'l', 'l', 'o', '\0' };

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

char *strcpy(char *dest, const char *src);
Αντιγράφει το src στο dest. Τα αλφαριθμητικά δεν πρέπει να επικαλύπτονται μεταξύ τους και θα πρέπει να υπάρχει αρκετός διαθέσιμος χώρος στο dest ώστε να αντιγραφεί το src χωρίς να βγούμε εκτός ορίων.
char *strcat(char *dest, const char *src);
Ενθέτει το src αμέσως μετά το dest. Αποθηκεύει το αποτέλεσμα στο dest. Τα αλφαριθμητικά δεν πρέπει να επικαλύπτονται μεταξύ τους και θα πρέπει να υπάρχει αρκετός διαθέσιμος χώρος στο dest για το προκύπτον αλφαριθμητικό.
int strcmp(const char *s1, const char *s2);
Συγκρίνει τα s1 και s2 μεταξύ τους και επιστρέφει μικρότερο, μεγαλύτερο ή ίσο με το μηδέν εάν το s1 είναι μικρότερο μεγαλύτερο ή ίσο με το s2.
size_t strlen(const char *s);
Επιστρέφει τον αριθμό των χαρακτήρων (μήκος) του αλφαριθμητικού.
char *strchr(const char *str, int c);
Επιστρέφει ένα δείκτη στην πρώτη εμφάνιση του c στο str. Eπιστρέφει NULL εάν δεν εμφανίζεται το c στο str.
char *strrchr(const char *str, int c);
Επιστρέφει ένα δείκτη στην τελευταία εμφάνιση του c στο str. Eπιστρέφει NULL εάν δεν εμφανίζεται το c στο str.
char *strstr(const char *haystack, const char *needle);
Επιστρέφει ένα δείκτη στην πρώτη εμφάνιση του needle στο heystack. Eπιστρέφει NULL εάν δεν εμφανίζεται το needle στο heystack.
char *strstr(const char *haystack, const char *needle);
Επιστρέφει ένα δείκτη στην τελευταία εμφάνιση του needle στο heystack. Επιστρέφει NULL εάν δεν εμφανίζεται το needle στο heystack.

Η κλάση String

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

Δείτε το παρακάτω παράδειγμα χρήσης της κλάσης string:

string.cpp
int main(int argc, char *argv[]) {
  string str = "Hello World!";
  cout << str  << endl;
  str.append(" How are you?");
  cout << str << endl;
 
  str = "Hello Wordl!";
  str += " How are you?";
  cout << str << endl;
}

Οι βασικές μέθοδοι της κλάσης string είναι οι εξής:

Κατασκευαστές

string();
default constructor
string (const string& str);
copy constructor
string (const string& str, size_t pos, size_t len = npos);
substring constructor
string (const char* s);
from c-string constructor
string (const char* s, size_t n);
from c-string sequence
string (size_t n, char c);
fill with c

Παράδειγμα χρήσης κατασκευαστών

strings_constructor.cpp
#include <iostream>
using namespace std;
 
int main() {
  string str = "Hello World!";
  string copy(str); 
  string substring(str, 0, 5);
  const char *p = str.c_str();
  string fromCString(p);
  string fromCSequence(p, 8);
  string fillwithDollars(5, '$');
 
  cout << str << endl;
  cout << copy << endl;
  cout << substring << endl;
  cout << p << endl;
  cout << fromCString << endl;
  cout << fromCSequence << endl;
  cout << fillwithDollars << endl;  
}

Μέθοδοι

Χωρητικότητα και μέγεθος αλφαριθμητικού

size_t size() const;
Επιστρέφει το μέγεθος του string
size_t length() const;
Μέθοδος ανάλογη της μεθόδου size
size_t capacity() const;
Χωρητικότητα του αλφαριθμητικού (σε bytes)
void resize (size_t n); και 
 void resize (size_t n, char c);
Επεκτείνεται το αλφαριθμητικό ώστε να έχει νέο μέγεθος n.
void reserve (size_t n = 0);
Μεταβάλλει τη χωρητικότητα του αλφαριθμητικού.
void clear();
Διαγράφει τα περιεχόμενα του αλφαριθμητικού
bool empty() const;
Επιστρέφει true εάν το αλφαριθμητικό είναι άδειο.

Πρόσβαση σε χαρακτήρες του αλφαριθμητικού

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
Επιστρέφει μία αναφορά στη θέση pos του string.
char& at (size_t pos);
const char& at (size_t pos) const;
Επιστρέφει μία αναφορά στη θέση pos του string. Πετάει out_of_range exception εάν δοθεί τιμή εκτός των ορίων του πίνακα.
char& back();
const char& back() const;
Επιστρέφει μία αναφορά στον τελευταίο χαρακτήρα του string.
char& front();
const char& front() const;
Επιστρέφει μία αναφορά στον πρώτο χαρακτήρα του string.

Στις όλες παραπάνω περιπτώσεις εάν το string είναι const επιστρατεύεται η const έκδοση της συνάρτησης.

Διάτρεξη

iterator begin();
const_iterator begin() const;
Επιστρέφει έναν iterator που δείχνει στον πρώτο χαρακτήρα του string.
iterator end();
const_iterator end() const;
Επιστρέφει έναν iterator που δείχνει μετά τον τελευταίο χαρακτήρα του string.
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
Επιστρέφει έναν reverse iterator που δείχνει στον τελευταίο χαρακτήρα του string.
reverse_iterator rend();
const_reverse_iterator rend() const;
Επιστρέφει έναν reverse iterator που δείχνει πριν από τον πρώτο χαρακτήρα του string.

Παράδειγμα χρήσης iterator

#include <iostream>
#include <string>
using namespace std;
 
int main (){
  string str = "Hello World!";
  for( string::iterator it=str.begin(); it!=str.end(); ++it)
    cout << *it;
  cout << endl;
}

Παράδειγμα χρήσης reverse_iterator

#include <iostream>
#include <string>
using namespace std;
 
int main (){
  string str = "Hello World!";
  for (string::reverse_iterator rit=str.rbegin(); rit!=str.rend(); ++rit)
    cout << *rit;
  cout << endl;
}

Μεταβολή του αλφαριθμητικού

string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);
Επεκτείνει το αλφαριθμητικό προσθέτοντας τους επιπλέον χαρακτήρες του ορίσματος στο τέλος του. Επιστρέφει μία αναφορά στο τρέχον αντικείμενο.
string& append (const string& str);
string& append (const char* str);
Επεκτείνει το αλφαριθμητικό ενθέτοντας ένα αντίγραφο του str στο τέλος του.
string& assign (const string& str);
string& assign (const char* str)
Αντιγράφει το str στο string.
string& insert (size_t pos, const string& str);
string& insert (size_t pos, const char* str);
Ενθέτει ένα αντίγραφο του str στη θέση pos του string.
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);
Διαγράφει μέρος του string, μειώνοντας το μήκος του.
string& replace (size_t pos,  size_t len,  const string& str);
string& replace (size_t pos,  size_t len,  const char* s);
string& replace (size_t pos,  size_t len,  const string& str,
                 size_t subpos, size_t sublen);
Αντικαθιστά το υφιστάμενο string με το νέο str ξεκινώντας από την θέση pos του string και για μήκος len.
void swap (string& str);
Ανταλλάσει αμοιβαία το περιεχόμενο του τρέχοντος string με το περιοχόμενο του string str.
append.cpp
#include <iostream>
#include <string>
using namespace std;
 
int main () {
  string str="Hello";
  string str2=" ";
  char[] str3="World";
  string str4 = "!\n";
 
  str+=str2;
  str.append(str3);
  str.append(str4);
  cout << str;
}
replace.cpp
#include <iostream>
#include <string>
using namespace std;
 
int main () {
  string base="this is a test string.";
  string str2="n example";
  string str3="sample phrase";
  string str4="useful.";
 
  string str=base;                // "this is a test string."
  str.replace(9,5,str2);          // "this is an example string." (1)
  str.replace(19,6,str3,7,6);     // "this is an example phrase." (2)
  str.replace(8,10,"just a");     // "this is just a phrase."     (3)
  cout << str << endl;
}
chicken.cpp
#include <iostream>
#include <string>
using namespace std;
 
main (){
  string chicken ("chicken");
  string egg ("egg");
  cout << "Before the swap, chicken comes from " << chicken;
  cout << " and egg comes from " << egg << endl;
 
  chicken.swap (egg);
  cout << "After the swap, chicken comes from " << chicken;
  cout << " and egg comes from " << egg << endl;
}

Σύγκριση, αναζήτηση, εξαγωγή υπο-αλφαριθμητικών

const char* c_str() const;
Επιστρέφει ένα C-string από ένα αντικείμενο της κλάσης string.
const char* data() const;
Ανάλογη με την c_str() με την διαφορά ότι η σειρά χαρακτήρων που προκύπτει δεν τερματίζεται με τον χαρακτήρα '\0'.
size_t copy (char* s, size_t len, size_t pos = 0) const;
Αντιγράφει ένα υπο-string του τρέχοντος string στον πίνακα που δείχνει ο δείκτης s.
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* str, size_t pos = 0) const;
size_t find (const char* str, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;
Αναζητά στο string την πρώτη εμφάνιση του string str ή του χαρακτήρα c ξεκινώντας την αναζήτηση από την θέση pos.
|  <code cpp>size_t rfind (const string& str, size_t pos = npos) const;
size_t rfind (const char* str, size_t pos = npos) const;
size_t rfind (const char* str, size_t pos, size_t n) const;
size_t rfind (char c, size_t pos = npos) const;
Αναζητά στο string την τελευταία εμφάνιση του string str ή του χαρακτήρα c ξεκινώντας την αναζήτηση από την θέση pos και αγνοώντας όλους του χαρακτήρες που βρίσκονται μετά τη θέση pos.
string substr (size_t pos = 0, size_t len = npos) const;
Επιστρέφει ένα νέο αντικείμενο το οποίο αποτελεί υπο-string του τρέχοντος αντικειμένου, ξεκινώντας από την θέση pos και με μήκος len.
int compare (const string& str) const;
int compare (size_t pos, size_t len, const string& str) const;
int compare (const char* str) const;
int compare (size_t pos, size_t len, const char* str) const;
Συγκρίνει το τρέχον string με το δοθέν string ή με το υπο-string που ξεκινάει από την θέση pos του str και έχει μήκος len.
cstring.cpp
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
 
int main () {
  string str ("Split this sentence to word tokens");
  char * cstr = new char [str.length()+1];
  strcpy (cstr, str.c_str());
 
  char * p = strtok (cstr," ");
  while (p!=0) {
    cout << p << '\n';
    p = strtok(NULL," ");
  }
  delete[] cstr;
}
cpp/strings.1494227189.txt.gz · Last modified: 2017/05/08 06:06 (external edit)