Stringhe

Descrizione
Definizione
Assegnazione
Lunghezza
Stringhe di tipo C
I/O
 

Descrizione
Le stringhe sono sequenze di caratteri, generalmente utilizzate per rappresentare parole e frasi, eventualmente contenenti dati numerici rappresentati tramite i corrispondenti caratteri numerici.
In c++ si puo' indicare tale sequenza di caratteri racchiudendola tra doppi apici:

    "questa e' una stringa"

Tecnicamente questa entita' viene detta string literal e viene considerata una sequenza (array) di const char, i cui elementi hanno per valore (non modificabile) il numero che nella codifica ASCII corrisponde al carattere relativo (vedi C-strings).
Questo tipo (string literal) puo' essere utilizzato per la definizione di una sequenza di caratteri nota, ma ha dei limiti, quali l'impossibilita' di modificarne e di manipolarne il contenuto.

La libreria standard del c++ definisce una classe opportuna per trattare le stringhe, di nome string. Tramite questa classe e' possibile effettuare operazioni di manipolazione delle stringhe, quali l'assegnazione, la ricerca di substring, il confronto, l'aggunta di caratteri, la concatenazione etc.
 

Dichiarazione di variabili di tipo string
Per poter dichiarare ed utilizzare variabili di tipo string e' necessario includere il file che definisce la classe stessa:

    #include <string>

La dichiarazione di una variabile di tipo string si esegue in modo analogo alla dichiarazione delle variabili di tipo nativo:

    string s;
 

Assegnazione
L'assegnazione di un valore ad una variabile di tipo stringa puo' essere fatta nei seguenti modi:

    string s1,s2;
    s1 = "valore della stringa"    // assegnazione tramite string literal
    s2 = s1;                                 // assegnazione tramite copia di s1

L'assegnazione puo' essere eseguita anche al momento della definizione della variabile:

    string s = "valore della stringa";
    string s1("altro valore");
    string s2 = s1;                  // assegna ad s2 lo stesso valore di s1
 

Lunghezza delle stringhe
E' possibile ricavare la lunghezza di una stringa, cioe' il numero di caratteri di cui e' composta, tramite le due istruzioni equivalenti:

    string s = "Ciao, mondo";
    int len = s.length();                // assegna alla variabile len il valore 11
    int len2 = s.size();                 // istruzione equivalente
 

Stringe di tipo C (C-style strings)
In C le stringhe sono gestite tramite array di char o unsigned char. Il contenuto degli elementi dell'array sara' il valore numerico che, secondo la codifica ASCII, e' associato al corrispondente carattere della stringa.
Per convenzione, la stringa viene terminata con un char di valore 0 (NUL), che si chiama terminatore; per questo motivo, per definire una stringa di lunghezza len, si dovra' allocare un array di len+1 char o unsigned char, in modo da riservare lo spazio per il terminatore.

    char buffer[12] = "Ciao, mondo";    // ad es., buffer[0] vale 'C', buffer[11] vale 0.

Benche' la gestione delle stringhe tramite la classe string sia completa, molte funzioni di libreria richiedono come parametro una stringa di tipo C (ad esempio la open() per aprire un file). Per poter ottenere questo da una variabile di tipo stringa, va utilizzata l'istruzione seguente:

    string file = "dati.dat";        // definisco la variabile di tipo string
    infile input;                          // definisco la variabile per aprire un file in lettura
    input.open(file.c_str());       // istruzione per aprire il file, che vuole come parametro una C-style string
 
 

I/O di stringe da/verso streams
L'input e l'output delle stringhe da e verso stream (iostream, fstream, etc.) si attua in modo analogo a quello per gli altri tipi di variabile:

    string s;
    cin >> s;          // leggo una stringa da terminale
    cout << s;        // scrivo una stringa su terminale
    ifstream iFile;
    iFile.open("<nome del file>");
    iFile >> s;        // leggo una stringa da file

Va ricordato che la concatenazione sugli stream utilizza come separatori sia il NL (ritorno a capo) che il blank (spazio); questo significa che se, eseguendo l'esempio appena visto, si digita sul terminale la riga

    ciao, mondo

la variabile s assumera' valore "ciao,". Per poter leggere tutta una riga (fino al ritorno a capo) da un input stream (ad esempio, cin, o una variabile di tipo ifstream), si puo' usare l'istruzione

    getline(cin, s);
    getline(iFile, s);    // dove iFile e' la ifstream definita prima

in questo caso la variabile s assumera' il valore "ciao, mondo".