I caratteri

Fino ad ora abbiamo lavorato con numeri in sostanza. Valori interi, double, array di numeri…

In C++ non esistono però solo numeri, ma anche i caratteri. Andiamo nel dettaglio.

I caratteri

Un carattere è un simbolo, che può essere una lettera, un segno di punteggiatura, anche un numero, e addirittura gli spazi, i simboli che tu non vedi (i cosiddetti caratteri blank). Generalmente ogni simbolo che tu puoi inserire con la tastiera, che tu lo veda o meno, è un carattere.

Ad esempio, sono caratteri: a, 7, ?, (carattere tab), G.

La tabella ASCII

In C++, ogni carattere ha un codice numerico. Questo codice è definito nella tabella ASCII, utilizzata dai compilatori. Ecco una tabella ASCII:

Tabella ASCII

I codici:

  • da 0 a 32 sono i caratteri blank: si possono scrivere e aggiungere al programma, ma non è detto che tu li veda o li senta. Ad esempio: lo spazio ha il codice 32, e tu lo puoi vedere; il codice 7 è un suono di sistema che puoi sentire.
  • da 33 al 47 sono una prima parte dei segni di punteggiatura.
  • da 48 al 57 sono invece le cifre, ma sottoforma di carattere. Fai attenzione, quando scriverai un programma che le utilizza, perché se le cifre sono dei caratteri e non dei numeri (quindi sono char e non int o double) non puoi utilizzarle per effettuare operazioni matematiche, a meno che non le converti!
  • da 58 al 64 sono la second parte dei segni di punteggiatura.
  • da 65 al 90 sono le lettere maiuscole.
  • da 97 al 122 sono le lettere minuscole.

Non ha senso impararsi a memoria la tabella ASCII, perché è troppo lunga da imparare, si perde tempo e in fondo non è neanche poi così utile, dato che i linguaggi di programmazione più recenti offrono metodi più alternativi dei codici.

Un’altra precisazione: il C++ utilizza la tabella ASCII standard, composta da 128 caratteri. Esiste anche una versione più evoluta, la tabella ASCII estesa, composta da 256 caratteri.

Se hai provato a stampare una e accentata (è), avrai sicuramente notato che non viene stampata correttamente e che viene sostituita con un altro carattere. Questo succede perché la è fa parte della tabella ASCII estesa, ma il C++ prevede solo la tabella standard.

E in C++?

In C++ puoi dichiarare una variabile carattere con la parola chiave char. Fino ad adesso avevamo utilizzato solo int, float e double. La scrittura è sempre la stessa degli altri tipi:

char <nomeVariabile> = <carattere o codice>;

Alla variabile puoi assegnare o il codice del carattere o il carattere stesso. Ad esempio puoi assegnare alla variabile:

char car = 65; //codice ASCII del carattere 'A', secondo la tabella

oppure:

char car = 'A'; //Assegnazione diretta permessa dal C++

In C++, come puoi ben vedere, puoi assegnare ad una variabile char direttamente il carattere, mettendolo tra apici (‘ ‘), senza ricorrere al suo codice ASCII. Per questo motivo non ha senso imparare la tabella ASCII a memoria ma solo alcuni pezzi se necessario.

Questo tipo di scrittura può essere usata anche nei controlli, nei cicli o negli if-else.

Ad esempio: voglio controllare che un carattere sia una lettera minuscola:

#include <iostream>

using namespace std;

int main() {
	char car;
	
	cout<<"Inserisci un carattere: ";
	cin>>car; //l'inserimento è il solito
	
	if(car>='a' && car<='z') {
		cout<<"Minuscola";
	} else {
		cout<<"Altro carattere";
	}
	
	return 0;
}

In questo if controllo se il carattere è compreso tra a e z. Se è vero scrive “Minuscola”, altrimenti “Altro carattere”. Anche qui, come l’esempio precedente, avrei potuto utilizzare il codice ASCII 97 (‘a’) e il codice 122 (‘z’).

Non confondere interi e caratteri!

Attenzione! Se scrivo:

int n = 3;
char c = '3';

Non sono la stessa cosa!

n è una variabile intera, che potrà essere utilizzata per effettuare calcoli matematici. c è invece un carattere, e non può essere utilizzato per effettuare calcoli matematici.

Ad esempio, se scriviamo:

int somma = n + 13;
int sommaErrata = c + 13;
char carattere = c + 13;

La viariabile somma conterrà 16, ovvero la somma tra due interi, 3 e 13.

La variabile sommaErrata non conterrà la somma tra 3 e 13. Essendo c un carattere, per fare questa somma utilizzerà il suo codice ASCII, che è 51. Di conseguenza, il programma farà la somma tra 51 e 13, che è 64, ovvero il carattere ‘@’.

La variabile carattere seguirà lo stesso comportamento della variabile sommaErrata, ma in questo caso potrai visualizzare sul terminale il carattere ‘@’.

Convertire un carattere in numero e viceversa

DA CARATTERE A NUMERO

In alcuni casi, dei calcoli matematici particolari sono utili, ad esempio per convertire una cifra sottoforma di carattere in numero. Per farlo, ad esempio, occorrerà scrivere:

char car = '6';
int numero = car - '0';

In questo modo, la variabile numero conterrà 6, però come intero e non come carattere. Questo è successo perché la variabile car è un carattere e io ho eseguito una sottrazione. Di conseguenza, il compilatore prenderà il suo codice ASCII, che è 54. Per ottenere 6, devo sottrarre 48, che è proprio il codice ASCII del carattere ‘0’. Quindi, 54-48=6, che è proprio il numero che volevo.

Questo si può anche fare con le altre cifre. Ad esempio, se car valesse ‘9’, per convertirlo assegno a numero: car – ‘0’ (Lo ‘0’, nelle conversioni da carattere a numero, non cambia mai).

DA NUMERO A CARATTERE

Analogamente a quanto fatto sopra, posso convertire un numero in carattere facendo:

int numero = 5;
char car = 5 + '0';

in questo modo, car conterrà 5 + 48, ovvero 53, codice ASCII del ‘5’.

Alcune funzioni utili che lavorano sui caratteri

Esistono alcune funzioni che possono essere utili durante la scrittura di un programma. Di seguito te ne elenco alcune. Queste funzionano solo se si include la libreria cctype.

int isalnum(int car); Restituisce un numero diverso da zero se il carattere è una lettera o una cifra
int isalpha(int car); Restituisce un numero diverso da zero se il carattere è una lettera
int isdigit(int car); Restituisce un numero diverso da zero se il carattere è una cifra
int islower(int car);
int isupper(int car);
Restituisce un numero diverso da zero se il carattere è una lettera minuscola;
Restituisce un numero diverso da zero se il carattere è una lettera maiuscola
int tolower(int car);
int toupper(int car);
Converte una lettera in minuscolo;
Converte una lettera in maiuscolo

Ovviamente queste funzioni non si posso imparare a memoria. Probabilmente più si utilizzano, più si ricordano.

Si possono comunque non utilizzare, anche perché si può ottenere lo stesso risultato utilizzando le condizioni. Ad esempio, se non si ricorda la funzione isdigit, si può semplicemente controllare se il carattere è compreso tra 0 e 9!


Ora proviamo a mettere qualche carattere insieme con le stringhe!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.