Fondamenti di Informatica A - Massimo Bertozzi ARRAY E STRINGHE Curiouser and curiouser! Alice's Adventures in Wonderland, Lewis Carrol
Fondamenti di Informatica A - Massimo Bertozzi Gli array ✗ In C si definisce vettore (array) un insieme di variabili dello stesso tipo memorizzate consecutivamente. ✗ Gli array permettono la gestione di grandi moli di dati correlati tra di loro e dello stesso tipo. ✗ Ogni singola variabile dell`array è denominata elemento e vi si accede tramite un indice che varia tra 0 e il numero degli elementi-1
Fondamenti di Informatica A - Massimo Bertozzi Dichiarazione di un array ✗ La dichiarazione di un array generico è del tipo: Tipo Nome_array[Numero elementi]; ✗ Ad esempio: #define GIORNI 7 double temperature[GIORNI];
Fondamenti di Informatica A - Massimo Bertozzi Accesso ai singoli elementi ✗ L`accesso ai singoli elementi avviene tramite un indice intero: ✗ primo elemento: temperature[0]; ✗ terzo elemento: temperature[2]; ✗ ultimo elemento: temperature[GIORNI-1];
Fondamenti di Informatica A - Massimo Bertozzi Inizializzazione di un array ✗ L`inizializzazione di un array può avvenire sia in fase di dichiarazione che successivamente: char nome[8]={'P', 'i', 'e', 'r', 'o'}; nome[0]='P'; ✗ Nel primo caso gli elementi successivi sono inizializzati a 0: nome[5]==0 è true
Fondamenti di Informatica A - Massimo Bertozzi Occupazione in memoria ✗ I singoli elementi di un array (monodimensionale) sono memorizzati consecutivamente in memoria: int A[100]={3,4,8}; ✗ L`accesso ad un elemento avviene come: A+indice 4 A[1] 8 A[2] 0 A[3] 0 A[4] 0 A[5] 3 A[0] 0FFC 0 A[6] A[7] C A[8] 101C
Fondamenti di Informatica A - Massimo Bertozzi PERICOLO! limiti di un array ✗ A differenza di molti altri linguaggi il C non effettua controlli sulla correttezza dell'Indice! int dummy[100]; dummy[100]=7; dummy[-1]=0; ✗ Le ultime due righe sono un esempio di buffer overrun e possono portare a: ✗ malfunzionamento del programma ✗ malfunzionamento del sistema operativo
Fondamenti di Informatica A - Massimo Bertozzi Occupazione in memoria ✗ È possibile la definizione di array a piú dimensioni: int A[2][3]={3,4,8,1,2,7}; int A[2][3]={{3,4,8},{1,2,7}}; ✗ Lo standard ANSI non pone limiti al numero di dimensioni sebbene alcuni compilatori possano prevederne long b[2][3][7][12][1024]; char Sbagliato[23,67,89]; 4 A[0][1] 8 A[0][2] 1 A[1][0] 2 A[1][1] 3 A[0][0] 0FFC C 7 A[1][2] 1010 ??? A[2][0] 1014
Fondamenti di Informatica A - Massimo Bertozzi Omissione delle dimensioni Quando l'inizializzazione di un array coincide con la sua dichiarazione si possono omettere le dimensioni (una sola): long TreElementi[]={3,101325,-17}; short MatriceDuePerDue[][2]={1,1,2,3}; double ErroreInCompilazione[][]={1,2,3,4};
Fondamenti di Informatica A - Massimo Bertozzi Passaggio a funzioni ✗ Il passaggio di array a funzioni avviene per indirizzo: int a[100], b[10][20]; // array di interi void MiaFunc(int k[]); // funzione che prende come argomento un array di interi void MiaFunc(int *k); // equivalente alla precedente MiaFunc(a); // invocazione void AltraFunc(int j[][20]);
Fondamenti di Informatica A - Massimo Bertozzi Le stringhe ✗ Uno dei più comuni utilizzi di un array è la gestione di stringhe. carattere nullo ✗ Per stringa si definisce un array di char terminato dal carattere nullo '\0'. char LaMiaPrimaStringa[4]={'a','b','c','\0'}; char LaMiaPrimaStringa[4]=''abc''; char LaMiaSecondaStringa[]=''def''; char NonStringa[]={'g','h','i'}; char StoLargo[100]=''jklmnop'';
Fondamenti di Informatica A - Massimo Bertozzi La libreria cstring.h ✗ Il C fornisce numerose funzioni per la manipolazione delle stringhe: #include ✗ Il C++ estende le capacità del C mediante la classe stringa #include string s1; // non ne parleremo
Fondamenti di Informatica A - Massimo Bertozzi #include int strcasecmp(const char *s1, const char *s2); char *strcat(char *dest, const char *src); char *strchr(const char *s, int c); int strcmp(const char *s1, const char *s2); int strcoll(const char *s1, const char *s2); char *strcpy(char *dest, const char *src); size_t strcspn(const char *s, const char *reject); char *strdup(const char *s); char *strfry(char *string); size_t strlen(const char *s); char *strncat(char *dest, const char *src, size_t n); int strncmp(const char *s1, const char *s2, size_t n); char *strncpy(char *dest, const char *src, size_t n); int strncasecmp(const char *s1, const char *s2, size_t n); char *strpbrk(const char *s, const char *accept); char *strrchr(const char *s, int c); char *strsep(char **stringp, const char *delim); size_t strspn(const char *s, const char *accept); char *strstr(const char *haystack, const char *needle); char *strtok(char *s, const char *delim); size_t strxfrm(char *dest, const char *src, size_t n); char *index(const char *s, int c); char *rindex(const char *s, int c);
Fondamenti di Informatica A - Massimo Bertozzi cstring.h (2) ✗ Tutte le funzioni elencate si basano sull'esistenza del carattere nullo ('\0') di terminazione. ✗ L'utilizzo delle doppie virgolette '' '' implica l'aggiunta del carattere nullo. ✗ L'assenza del '\0' implica malfunzionamenti: ✗ errori in lettura; ✗ errori in scrittura; Aggiungere il '\0' qualora necessario