PROGRAMMIAMO
C++ - Acquisiz. stringhe
Stringhe (vettori di char)

In questo e nei prossimi paragrafi tratteremo le stringhe in modo "tradizionale", cioè facendo riferimento al linguaggio C. Il linguaggio C++ offre, oltre a quello tradizionale, anche un modo più semplice ed efficiente per la gestione delle stringhe di caratteri, utilizzando il contenitore string.

In C una stringa è un vettore di variabili di tipo char. Esempio:

char parola[8];

Il numero fra parentesi indica il massimo numero di caratteri che la stringa può contenere. Le stringhe sono usate per memorizzare e manipolare sequenze di caratteri, come per esempio parole e frasi.

A differenza di quanto succede con i vettori numerici, non sono necessari cicli per acquisire o visualizzare un vettore di char. Si consideri il seguente esempio:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
char stringa[10];

cout<<"Fornisci una parola: ";
cin>>stringa;

cout<<"La parola inserita e' "<<stringa<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}

Si osservi l'acquisizione del vettore con l'istruzione:

cin>>stringa;

e la sua visualizzazione in:

cout<<"La parola inserita e' "<<stringa<<"\n";

In entrambi i casi il nome del vettore di char viene fornito senza parentesi quadre. Infatti non si vuole acquisire o visualizzare un singolo elemento del vettore (cioè un singolo carattere), ma l'intero vettore.

Memorizzazione della stringa all'interno del vettore di char

Sempre con riferimento all'esempio precedente, supponiamo di aver fornito da tastiera la parola:

SCUOLA

Essa viene memorizzata dall'istruzione cin>>stringa all'interno del vettore stringa nel seguente modo:

Si noti che i singoli caratteri della parola vengono memorizzati negli elementi successivi del vettore (0, 1, 2, 3...).

Dopo l'ultimo carattere viene inserito automaticamente dalla cin un carattere speciale non stampabile detto null (o anche terminatore di stringa) e con codice ASCII uguale a zero. Il carattere null viene rappresentato per mezzo della sequenza di escape '\0'.

Come si è detto il terminatore di stringa viene inserito dalla cin dopo l'ultimo carattere digitato ed è importante poiché serve alle altre istruzioni (in particolare alla cout) per sapere dove termina la stringa. Infatti, come si può osservare dall'esempio precedente, un vettore di char non dev'essere necessariamente riempito tutto. Gli elementi successivi al carattere null vengono semplicemente ignorati dalla cout (contengono valori casuali, senza nessun significato).

Siccome il vettore di char deve sempre contenere un terminatore finale, le sue dimensioni devono sempre essere di almeno un elemento maggiori rispetto alla lunghezza della stringa da acquisire. Per esempio per acquisire la parola "SCUOLA" il vettore di char dovrà essere dichiarato con almeno 6 elementi o più (5 per i caratteri della parola + 1 per il null finale).

 

Istruzione cin.getline

L'istruzione cin presenta alcuni problemi, quando è usata per acquisire le stringhe.

Il primo problema è che l'acquisizione della cin termina quando viene incontrato il primo spazio vuoto (blank). Questo significa che se nel programma

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
char stringa[10];

cout<<"Fornisci una parola: ";
cin>>stringa;

cout<<"La parola inserita e' "<<stringa<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}

fornisco come input le due parole

Uno Due

mi verrà visualizzato solo

Uno

Questo comportamento della cin impedisce di acquisire intere frasi contenenti al proprio interno spazi vuoti, poiché in ogni caso verrebbe acquisita solo la prima parola.

Il secondo problema della cin è che questa istruzione non effettua alcun controllo dell'overflow del vettore. In altre parole, se si fornisce una sequenza di caratteri di lunghezza maggiore del numero di elementi dichiarato nel vettore, la cin provoca un overflow del vettore (che, potenzialmente, può bloccare il programma o creare altri malfunzionamenti).

Per risolvere questi problemi della cin, l'acquisizione delle stringhe in C++ viene di solito effettuata usando l'istruzione cin.getline nel seguente modo:

char stringa[10];

cout<<"Fornisci una stringa: ";
cin.getline(stringa,10);

La sintassi è la seguente:

cin.getline(vettore_di_char, massimo_numero_di_char);

La cin.getline riempie il vettore fino al massimo numero di caratteri indicato (compreso il '\0' finale). Se la stringa fornita è più lunga, esse viene troncata alle dimensioni massime specificate (in realtà un carattere in meno, sempre per via del null finale).

Inoltre la cin.getline acquisisce anche gli spazi vuoti eventualmente presenti nella stringa.

 

Inizializzazione di un vettore di char

Un modo rapido per assegnare un valore iniziale a un vettore di char è il seguente:

char frase[] = "Uno due tre";

Si notino i doppi apici (i doppi apici racchiudono un'intera stringa, mentre i singoli apici vengono usati per i caratteri) e le parentesi quadre aperte e chiuse senza nulla in mezzo. In questo modo le dimensioni del vettore vengono automaticamente fissate in base al suo contenuto (nell'esempio precedente, le dimensioni sarebbero 12 (cioè 11 caratteri, compresi i blank, più un terminatore di stringa).

E' importante però osservare che l'istruzione precedente non può essere usata per assegnare un valore a un vettore di char già dichiarato. L'esempio seguente è scorretto e produce un messaggio di errore:

char frase[12];
frase[] = = "Uno due tre"; //sbagliato, non funziona

Allo stesso modo il C non consente di copiare una stringa su un'altra per mezzo di una semplice assegnazione, come in questo esempio:

char frase1[]= "Uno due tre", frase2[12];
frase2 = frase ; //sbagliato, non funziona

Vedremo nella prossima lezione come per copiare stringhe ed eseguire altre importanti operazioni, si può ricorrere ad apposite funzioni di library.

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it