Lezione 8 C Le Stringhe

      Nessun commento su Lezione 8 C Le Stringhe


Ed eccomi qui a spiegarvi un altro importantissimo argomento, presente in tutti i linguaggi di programmazione: Le Stringhe.

E’ fondamentale che sappiate che in C il tipo primitivo STRINGA non esiste. Una stringa in C non è altro che un array di char, ovvero un array di caratteri come spiegherò più avanti. Invece in altri linguaggi di programmazione, come il C++, il tipo stringa esiste. Ma non andiamo fuori tema e andiamo a spiegare cosa sono le stringhe e come si lavora con esse:
Una stringa letteralmente non è altro che una sequenza di caratteri racchiusa fra doppi apici:

“Nel mezzo del cammin di nostra vita…”

Dunque sono rappresentabili in c semplicemente come degli array di caratteri e possono essere dichiarati in questo modo:

[code lang=”c”]char  stringa[4]="abc".[/code]

Ma adesso ci chiediamo, come viene allocata in memoria una stringa? Il compilatore alloca per una stringa, in questo caso, 3 byte + 1 byte. I tre byte servono per memorizzare “abc”, mentre quel +1 byte, serve a memorizzare il TERMINATORE DI STRINGA o NULL che indica la fine di una stringa, indicato nel C con “\0”. Dunque verrà memorizzato un vettore che è: “abc”.
Abbiamo detto dunque che una stringa viene memorizzata come un array di caratteri e quindi il compilatore la tratta come un puntatore di tipo char *. Infatti sia la printf che la scanf si aspettano un valore del tipo char * come loro primo argomento.
Ad esempio:

[code lang=”c”]printf("abc");[/code]

Quando la printf viene chiamata, le viene passato l’indirizzo di “abc”, ovvero un puntatore all’area di memoria contenente la lettera a).

INIZIALIZZARE UNA VARIABILE DI TIPO STRINGA

Abbiamo illustrato sopra, come inizializzare una variabile di tipo stringa: char stringa[4]=”abc”. Potete tranquillamente omettere il size dell’array, visto che il compilatore lo calcolerà automaticamente in fase di compilazione.
Ad esempio:

[code lang=”c”]char stringa[ ]="abc";[/code]

INPUT E OUTPUT DI STRINGHE

Possiamo immettere una stringa in input mediante due funzioni: scanf oppure gets. La scanf è la più comune e, come sappiamo, si trova nella libreria standard input/output (

#include <stdio.h>

).

Ha una sintassi di questo tipo:

[code lang=”c”]scanf("%s",stringa);[/code]

N.B.: non ho inserito la & commerciale davanti a stringa, perchè viene trattata come un puntatore quando viene passata alla scanf! La gets è più comoda, ed è fatta apposta per le stringhe. Dobbiamo solo ricordarci di includere la libreria per le stringhe. Ha una sintassi di questo tipo:

[code lang=”c”]gets(stringa);[/code]

Invece se volessimo stampare a schermo una stringa immessa precedentemente, possiamo usare le funzioni printf e puts. La funzione printf (come scanf) si trova nella libreria stdio.h ed ha una sintassi di questo tipo:

[code lang=”c”]printf("%s",stringa);[/code]

Oltre alla printf, come abbiamo detto, abbiamo la puts che ha una sintassi di questo tipo:

[code lang=”c”]puts(stringa);[/code]

Sintatticamente parlando puts e gets sono più semplici da usare rispetto a scanf e printf.

LEGGERE UNA STRINGA CARATTERE PER CARATTERE

E se volessimo leggere una stringa carattere per carattere? Anche qui le librerie del C ci vengono incontro fornendoci una funzione, getchar( ), che ci permette di leggere un carattere e poi memorizzarlo all’interno di una stringa, ovviamente dichiarata precedentemente. Scriviamo insieme il codice per una funzione che può fare questo

[code lang=”c”]
int legge_carattere(char stringa[ ], int n)
{
int carattere, i=0;
while (carattere=getchar( )) != ‘\n’)  /*Il ciclo continua finché non viene incontrato il carattere \n cioè invio*
if (stringa[i++]==carattere){
stringa[i]=’\0’;   /*termina la stringa perchè abbiamo incontrato il carattere terminatore NULL *
}
return i; /*ci restituisce il numero di caratteri memorizzati */
}[/code]

Un’osservazione importante da fare é la seguente: la variabile carattere è di tipo int e non char perchè la funzione getchar() restituisce un carattere che legge come un valore int!

LA LIBRERIA PER LE STRINGHE DEL C

Il C fornisce una libreria adatta ad eseguire molte operazioni sulle stringhe. Stiamo parlando dell’header file string.h.

Ci sono diverse funzioni per la manipolazione di stringhe e sottostringhe (porzioni di stringa), ma discuteremo solo di quelle più importanti: STRCPY: ovvero “string copy” che ha il seguente prototipo: char *strcpy(char *stringa_1, char *stringa_2);
La strcpy copia la stringa string_2 all’interno della stringa string_1. Detto con maggiore precisione: copia la stringa puntata da string_2 nel vettore puntato da string_1.
STRLEN: ovvero “string lenght” che ha il seguente prototipo: strlen(char *stringa_1);
La strlen restituisce la lunghezza della stringa che le abbiamo passato come argomento. Ovvero tutti i caratteri della stringa escluso il carattere NULL.
STRCAT: ovvero “string concatenation” che ha il seguente prototipo: char *strcat(char *stringa_1, char *stringa_2);
La strcat ha il compito di concatenare la stringa_2 alla fine della stringa_1, e restituisce un puntatore alla stringa_1 che avremo in output (che sarà la concatenazione fra le due stringhe).
STRCMP: ovvero “string comparison” che ha il seguente prototipo: int strcmp(char *stringa_1, char *stringa_2);
La strcmp confronta le due stringa stringa_1 e stringa_2 e se restituisce un valore minore di zero, la stringa_1 è minore della stringa_2, se restituisce 0 le stringhe sono uguali, se restituisce un valore maggiore di zero, la stringa_1 è maggiore della stringa_2.
STRCHR: cerca un particolare carattere all’interno di una stringa. Ha come prototipo: char *strchr(char *s, int c);
Ad esempio, se volessimo trovare la lettere m nella stringa miagolio:

[code lang=”c”]char *p, stringa[ ]="miagolio";
p=strchr(stringa,’m’); /*trova la prima m nella stringa*/
[/code]

La strchr restituisce un puntatore alla prima occorrenza della lettera che si vuole cercare. Se non ci sono occorrenze, la funzione restituisce un puntatore nullo.

STRSTR: la funzione “string string” cerca all’interno del suo primo argomento (una stringa), una corrispondenza con il suo secondo argomento (un’altra stringa). Questa funziona ha prototipo:

[code lang=”c”]char *strstr(char *stringa_1, char *stringa_2);
[/code]

Essa restituisce un puntatore alla prima occorrenza presente nella stringa di ricerca. Se non c’è alcun riscontro, restituisce anch’essa un puntatore nullo.

Anche per questa lezione è tutto, vi aspetto alla prossima!