Le stringhe in stile C (C-string)

Il linguaggio C++ ha conservato molto del linguaggio C, compresa la sua gestione delle stringhe in quanto indispensabile in alcuni contesti della programmazione. Il linguaggio C non mette a disposizione un tipo di dato specifico per le stringhe e per memorizzare una sequenza di caratteri alfanumerica utilizza un vettore di char. In C una stringa è un vettore di caratteri in cui l’ultimo elemento è un carattere terminatore (o di fine stringa), codificato con il carattere ASCII ‘\0’.

Si consideri la seguente dichiarazione in linguaggio C/C++:

stringac

Con  l’istruzione (1) viene dichiarata la variabile ‘cognome’ come un vettore di 20 char che può essere utilizzato per memorizzare stringhe lunghe al massimo 19 caratteri. Un elemento del vettore, infatti, dovrà sempre essere riservato al carattere terminatore. In particolare, quella dichiarazione contiene anche l’inizializzazione della la variabile con l’assegnazione della stringa “Rossi”. Con questo tipo di inizializzazione il carattere terminatore viene aggiunto automaticamente. Si noti che dopo l’inizializzazione, le celle di indice superiore a 5 non sono “occupate” da caratteri, ma sono vuote solo teoricamente in quanto in realtà esse possono contenere dei valori casuali. Di qui l’importanza della presenza del carattere terminatore per capire dove finisce la stringa. Una variante rispetto all’inizializzazione utilizzata nella (1), consiste nello specificare i singoli elementi come per un qualsiasi vettore:

La sinatassi (1) è sicuramente più comoda rispetto alla (2).

Errori tipici

Programmando in linguaggio C++ bisogna ricordarsi che la funzione scanf() opera solo con le stringhe in stile C. Si tenga presente, inoltre, che  essendo definita come un vettore di char, il  nome di variabile di una stringa in stile C  è una variabile di tipo puntatore ad un char e, quindi, essa contiene già l’indirizzo della stringa, pertanto:

Attenzione, l’assegnazione di una stringa ad un vettore di char è ammessa solo per l’inizializzazione del vettore nella sua dichiarazione (1), ma non è ammessa in nessun altra istruzione. Dopo la sua dichiarazione il vettore di char va trattato come un vettore a tutti gli effetti, eccezion fatta per alcune istruzioni evidenziate più avanti. Per cui non è possibile copiare una stringa in un’altra stringa con un’assegnazione:

ma può essere fatto copiando un elemento per volta:

Per la stessa ragione non è possibile confrontare due stringhe trattandole come due comuni variabili:

Si ricordi che le stringhe in stile C sono dei vettori, per cui anche i confronti possono essere fatti solo fra gli elementi dei vettori. Solo a scopo didattico, per verificare l’uguaglianza tra s1 e s2 una possibile soluzione (che è da sconsigliare nei casi reali in cui vedremo è possibile utilizzare una opportuna funzione di libreria) potrebbe essere:

Nel programma precedente la verifica dell’uguaglianza fra le due stringhe avviene elemento per elemento, facendo una scansione dei due vettori di char. Ovviamente questo modo di operare già solo per fare un semplice confronto di uguaglianza sarebbe insostenibile, ed è per questo che per rendere più semplici le operazioni sulle stringhe in stile C conviene studiare la libreria C string.h, che contiene molte funzioni utili.

Eccezioni

Con le stringhe in stile C sono ammesse alcune eccezioni rispetto alla  sintassi degli altri tipi di vettori. La prima eccezione è rappresentata dalla (1), già descritta sopra, le altre sono:

Sono delle eccezioni, perché tutti gli altri tipi di vettori diversi dal tipo char, infatti, possono essere caricati o visualizzati solo elemento per elemento.

Funzioni di libreria per la manipolazione delle C-string

La libreria standard del C dispone di funzioni molto utili per la gestione delle stringhe. Per poter utilizzare tali funzioni bisogna includere nel proprio file sorgente il file di libreria string.h:

  • FUNZIONE strcmp

La funzione strcmp confronta due stringhe passate come parametro e restituisce al chiamante

  • 0, se s1 == s2;
  • un numero <0, se s1<s2;
  • un numero >0, se s1>s2;

Esempio:

  • FUNZIONE strcpy

La funzione strcpy copia la variabile stringa ‘sorgente’ nella variabile stringa ‘destinazione’ . La stringa ‘destinazione’ deve essere sufficientemente grande per accogliere tutti gli elementi della stringa ‘sorgente’.

Esempio:

  • FUNZIONE strlen

La funzione strlen restituisce al chiamante la lunghezza in caratteri della stringa passata come parametro.

Esempio:

  • FUNZIONE strcat

La funzione strcat concatena le due stringhe passate come parametro.

Esempio:

Vettore di stringhe

La dichiarazione di un vettore di stringhe in stile C è analoga a quella dei vettori di tipo semplice:

dove N è il numero di elementi di tipo stringa composti da S caratteri.

Esempio: