Nella scorsa pagina abbiamo visto cosa sono e come si utilizzano i caratteri.
Di una lettera possiamo farci ben poco, dato che i caratteri singoli servono solo in certi casi particolari. Sono molto più utili, invece, quando si vogliono mettere insieme, formando le stringhe.
Infatti, in C++ una stringa è un insieme di caratteri disposti in modo ordinato.
Parentesi: la differenza tra stringhe in stile C e stringhe in stile C++
Sappiamo che in C++ si possono utilizzare le librerie e le espressioni del linguaggio C.
Di conseguenza, le stringhe in C++ si possono creare utilizzando lo stesso metodo di creazione delle stringhe nel linguaggio C (utilizzando gli array di char).Per questo si parla di stringhe in stile C. Spesso questo è il metodo che si insegna a scuola.
Diversi studenti e principianti probabilmente non sanno che in realtà anche il C++ ha un suo metodo di base per dichiarare le stringhe (stringhe in stile C++). Il metodo “ufficiale” è quello di creare un oggetto di tipo string, che è l’istanza di una classe. Vedremo meglio come si creano le stringhe in stile C++, ma anche i concetti di istanza e classe, più avanti.
Quelle che ti insegnerò in questa pagina sono le stringhe in stile C.
Le stringhe in C++ (Stile C): spiegazione e rappresentazione

Questa è la rappresentazione di una stringa. Come puoi notare, è molto simile a quella dell’array di interi (infatti, una stringa in stile C è un array di char!).
Ci sono però un paio di osservazioni da fare:
- Ogni stringa termina con il carattere ‘\0’. Questo per far riconoscere al compilatore quando la stringa termina;
- L’array continua anche dopo il termine della stringa, perché solitamente si crea un array più grande rispetto alla stringa, fino alla posizione n, che sarebbe MAX_CARATTERI – 1 (MAX_CARATTERI è una costante che indica la dimensione dell’array).
Ricordiamo che essendo un array, l’indice parte da 0.
Come creare e inizializzare le stringhe in C++ (Stile C)
Le stringhe in stile C si dichiarano utilizzando un array di char. Si definisce nello stesso modo di un array di interi o double:
char <nomeStringa>[<dimensioneMassima>];
char str[50];
Se oltre a creare la stringa, la vogliamo anche inizializzare (ad esempio la vogliamo inizializzare con la stringa “informaticasi”), dobbiamo aggiungere qualcosa durante la creazione:
char str[50] = "informaticasi";
OPPURE
char str[] = "informaticasi";
Notiamo diverse cose:
- La stringhe, quando si creano, scrivono e dichiarano vanno sempre racchiuse tra virgolette (“”). Se non si utilizzano le virgolette, il compilatore le prenderebbe come nomi di variabili (che non esistono, quindi darebbe errore!);
- Per inizializzare una stringa, all’array di caratteri si assegna direttamente (tramite l’operatore =) il valore della stringa. L’assegnazione diretta della stringa può essere fatta solamente in fase di creazione;
- Come vedi, ho utilizzato due modi per inizializzare la stringa: nel primo ho indicato la dimensione massima dell’array, nella seconda no. C’è una differenza tra i due metodi (questa differenza potrebbe essere fondamentale in certi programmi che utilizzano funzioni sulle stringhe):
- Il primo metodo si utilizza generalmente quando si ha intenzione di cambiare la stringa contenuta all’interno dell’array (ad esempio concatenando un’altra stringa), che potrebbe avere quindi dimensioni diverse. Si può utilizzare anche se la stringa non sarà modificata in futuro nel programma;
- Il secondo metodo si utilizza quando inizializzi una stringa che non hai intenzione di cambiare nel corso del programma. Un altro motivo per utilizzare questo metodo è che, nel caso di stringhe lunghe, potresti non conoscerne la dimensione (e quindi non sapere se la dimensione massima dell’array è sufficiente).
- Quando l’utente scrive a mano, nel programma, una stringa, non va terminata con il carattere ‘\0’ (come da esempio), dato che è implicito (anche se non lo vedi, il compilatore lo inserisce in automatico, ma il programmatore non deve modificare la cella in cui è presente).
Input e output delle stringhe in C++
Per quando riguarda l’inserimento delle stringhe, non possiamo utilizzare stavolta il solito metodo di input (cin) nella maggior parte dei casi.
Questo perché l’istruzione cin permette di inserire un dato o una stringa, e quando si digita uno spazio o si va a capo sul terminale il suo inserimento termina. In questo modo non si potrebbero inserire stringhe con lo spazio, perché la cin al primo spazio incontrato terminerebbe l’input, e in caso di altri inserimenti di stringa successivi (di stringhe con spazi) non funzionerebbe correttamente.
Se comunque sei sicuro che la stringa che inserirai non conterrà spazi, potrai comunque usare cin.
Di conseguenza bisogna utilizzare una funzione. Le opzioni sono due:
- Utilizzare gets(<nomeStringa>): la funzione utilizzata per l’inserimento delle stringhe in C (per questi semplici programmi va bene, ma per programmi abbastanza complessi potrebbe causare problemi);
- Utilizzare cin.getline(<nomeStringa>, MAX_CARATTERI): prima del nome della funzione si deve mettere cin., seguito dal nome della funzione, che accetta come primo parametro il nome della stringa, e come secondo il numero massimo di caratteri che si possono inserire in questa stringa (generalmente si inserisce la lunghezza massima della stringa – la costante dichiarata).
Per l’output, invece, si può normalmente utilizzare il cout.
Ecco un programma di esempio, che inserisce una stringa e la stampa:
#include <iostream>
using namespace std;
#define MAX 30
int main() {
char str1[MAX];
char str2[MAX];
char str3[] = "Prova stringhe";
//cin>>str1; SBAGLIATO! prende solo la prima parola
gets(str1);
cin.getline(str2, MAX);
cout<<"Stringa 1: "<<str1<<endl;
cout<<"Stringa 2: "<<str2<<endl;
cout<<"Stringa 3: "<<str3;
}
Come per gli array di int o double, la costante che determina la dimensione dell’array deve essere abbastanza grande per contenere una stringa di prova, ma non troppo alto per evitare di sprecare spazio. C’è anche da considerare che cosa deve contenere la stringa. Se deve contenere un nome, la costante potrebbe essere di 15, se contiene un indirizzo completo, potrebbe essere di 50. Per una stringa generica, consiglio una dimensione da 30 a 50.
Accedere alle celle di una stringa
Posso accedere alla singole celle della stringa esattamente come farei con un array di interi, quindi con un ciclo che scorre tutte le celle.
Per fare questo devo però sapere la dimensione della stringa. Non è corretto scorrere tutti gli indici fino alla dimensione massima dell’array, dato che la stringa è più piccola di questa nella maggior parte dei casi (rischio di leggere caratteri “casuali”!).
Per sapere la dimensione della stringa esiste una funzione, strlen(<stringa>). Questa ritorna la lunghezza della stringa data in input. Per utilizzarla serve includere una nuova libreria: string.h.
Ecco un esempio di un ciclo che legge e stampa carattere per carattere:
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char str[] = "informaticasi";
for (int i=0; i<strlen(str); i++) {
cout<<str[i]<<endl;
}
}
Funzioni utili che lavorano sulle stringhe
Non sempre ti capiterà di accedere alla celle della stringa. Può capitare di dover lavorare con più stringhe.
Potresti aver bisogno di concatenare due stringhe, oppure di copiarne una dentro l’altra. Per fare questo, esistono altre funzioni che lavorano sulle stringhe:
| Funzione | Spiegazione | Esempio |
| size_t strlen(str); | Già accennata in precedenza. Ritorna la dimensione della stringa (non dell’array!) | int lung = strlen(str); |
| char* strcat(dest, src); | Concatena alla stringa dest la stringa src. Dopo aver eseguito la funzione, src si troverà in coda a dest, e dest verrà modificata rispetto a come era all’inizio. | strcat(str1, str2); strcat(str, “a tutti”); |
| int strcmp (str1, str2 ); | Confronta str1 con str2 (in ordine alfabetico, o più precisamente in ordine di valore ASCII). Se il primo carattere delle due stringhe è uguale, confronta il successivo, e così via. La funzione ritorna : – un numero <0, se str1 < str2; – zero, se le due stringhe sono uguali; – un numero >0, se str1 > str2; |
if (strcmp(str1, str2) == 0) { cout<<“Stringhe uguali”; } |
| char * strcpy ( dest, src); | Copia la stringa src dentro la stringa dest. Al termine della funzione, dest verrà modificata ma src rimarrà invariata. | strcpy(str1, str2); strcpy(str, “ciao”); |
Ci sono tante altre funzioni, ma queste sono quelle principali, e quelle che probabilmente userai di più in programmi più semplici come quelli che ti proporrò.
Una piccola nota per strlen: la funzione non ritorna un int, ma un size_t. size_t è un alias (un secondo nome) che indica il tipo di dato più grande rappresentabile dal compilatore (di solito, un long long int). Il valore di ritorno della funzione va quindi trattato come se fosse un intero, anche se il compilatore potrebbe dare un warning. Se il compilatore da warning perché stai utilizzando un int invece di un size_t, ignoralo, nei programmi più semplici (Non tutti i warning implicano un errore!).
Ottimo! Arrivato a questo punto è il momento di fare qualche esercizio sui caratteri e sulle stringhe!