LE STRINGHE. Manuale linguaggio C
|
|
- Raffaella Gatto
- 5 anni fa
- Visualizzazioni
Transcript
1 LE STRINGHE Manuale linguaggio C
2 Le stringhe Non esiste un tipo specifico per le stringhe; esse si rappresentano con un vettore di caratteri. Es. Hello World è: H e l l o \s W o r l d \0 Nella rappresentazione interna il vettore stringa è terminato dal carattere nullo \0 (NULL terminator) che ne rappresenta il delimitatore finale in modo che il programma possa trovarne la fine. Es.: char stringa[100]; Un vettore di 100 caratteri, cioè potenzialmente una stringa di 99 caratteri più \0.
3 Le stringhe Per usare un vettore di caratteri come una stringa serve assicurarsi che la lunghezza del vettore sia maggiore di quella dell inizializzazione. In caso contrario il compilatore ometterà il carattere terminatore rendendo il vettore non usufruibile come stringa. Quindi, un vettore unidimensionale di caratteri può essere usato per memorizzare stringa a patto che questo termini con il \0. La lunghezza della stringa dipende dalla posizione del carattere\0 e non dalla lunghezza del vettore nel quale è contenuta. Abbiamo incontrato più volte le stringhe letterali come stringhe di formato nelle chiamate alla printf() e scanf(). Quando il compilatore incontra una stringa letterale di lunghezza n, alloca per la stringa n+1 byte di memoria, considerando quindi lo spazio per il terminatore.
4 Dichiarazione e inizializzazione Una stringa di caratteri si può inizializzare, come ogni altro array, elencando le singole componenti: char s[4] = {'a', 'p', 'e', '\0'}; oppure anche, più brevemente, con la forma compatta seguente: oppure char s[4] = "ape" ; char nome[ ] = ape ; Il fatto che la lunghezza sia omessa non significa che questa possa essere successivamente modificata. Una volta che il programma viene compilato la lunghezza viene fissata. in questo caso la stringa viene dimensionata automaticamente a 4. Comodo per stringhe lunghe. Il carattere di terminazione \0 è automaticamente incluso in fondo. Attenzione alla lunghezza!
5 Dichiarazione e inizializzazione Il compilatore segnala un errore se si dichiara la lunghezza della stringa n, e si inizializza con una stringa costante di lunghezza >n char str[3] quattro ; /* SCORRETTO */ char str1[3] tre ; /* CORRETTO */ I compilatori ANSI, generalmente, consentono di specificare una dimensione di array che non includa il carattere terminatore. Esempio: char str[7] quattro ; /* CORRETTO */ Non c è alcuno spazio per il carattere terminatore e quindi il compilatore non tenta di metterne uno. Se la stringa con cui si inizializza un vettore è più corta della dimensione del vettore, il compilatore aggiunge caratteri terminatori, così come succede con il valore zero quando viene inizializzato un vettore di interi. Esempio: char str[10] quattro ; str conterrà i caratteri: q u a t t r o \0 \0 \0 Se inizializziamo un vettore per contenere una stringa è compito del programmatore assicurarsi che la lunghezza del vettore sia adeguata. In caso contrario, il compilatore ometterà il carattere null rendendo il vettore non utilizzabile come stringa.
6 Puntatori a carattere Possiamo usare una stringa letterale ovunque il C ammetta un puntatore a carattere, cioè un puntatore di tipo *char. Per esempio, una stringa letterale può apparire sul lato destro di un assegnamento: char *p; p abc ; Questo assegnamento non copia i caratteri abc ; fa si che il puntatore p punti alla prima lettera della stringa, cioè che l indirizzo specificato all interno della variabile puntatore sia quello della prima lettera della stringa. Sia la printf() che la scanf() si aspettano un primo argomento di tipo di tipo * char; quindi quando scriviamo printf( abc ); La printf viene invocata con l indirizzo di abc (nell esempio 1006) p A 100B 100C 100D 100E 100F a b c \0 6
7 Vettori di caratteri e ptr a caratteri char str[] testo ; È possibile inizializzare un puntatore a char con una stringa costante: char *ptr = altro testo ; si crea un array di caratteri, inizializzato ad altro testo, riservando però memoria anche per il puntatore Nel caso dell array, tutti i successivi accessi utilizzano il nome dell array come riferimento per l indirizzo dell elemento iniziale dell array: tale indirizzo non può essere modificato Il puntatore è una variabile e può essere modificato: l indirizzo relativo alla prima inizializzazione viene però perso 0FFF ptr str t e s t o A 100B 100C 100D 100E 100F a l t r o t e s t o \0 7
8 Vettori di caratteri e ptr a caratteri Qualsiasi funzione che si aspetti che le venga passato un vettore di caratteri o un puntatore a carattere, accetterà come argomento entrambe le versioni. Ma: Nella versione vettore, i caratteri presenti possono essere modificati come gli elementi di un qualsiasi vettore. Nella versione puntatore, il puntatore punta a una stringa letterale che non deve essere modificata: *ptr= a ; // SBAGLIATO, comportamento indefinito Nella versione vettore, str è il nome del vettore. Nella versione puntatore ptr è una variabile che può essere fatta puntare ad altre stringhe durante l esecuzione del programma. Se abbiamo bisogno di una stringa che possa essere modificata, è nostra responsabilità creare un vettore di caratteri nel quale memorizzarla str 0FFF t e s 1003 t 100A ptr o \ B 100C 100D 100E 100F a l t r o t e s t o \0 8
9 Gli assegnamenti a stringhe Una stringa costante viene quindi interpretata come un puntatore al primo carattere della stringa. Utilizzare un puntatore non inizializzato è un errore molto grave #include <stdlib.h> int main() { char array[10]; char *ptr1 = 10 spazi ; char *ptr2; } array = not OK ; /* SBAGLIATO, non è possibile assegnare un indirizzo */ array[5] = A ; /* OK */ *ptr1= a ; /* SBAGLIATO, non si modifica una stringa letterale */ *ptr2 = not OK ; /* SBAGLIATO, tipi non compatibili*/ ptr2[0]= a ; /* SBAGLIATO, ptr2 non inizializzato */ return 0;
10 Gli assegnamenti a stringhe Se abbiamo bisogno di una stringa che possa essere modificata, è nostra responsabilità creare un vettore di caratteri nel quale memorizzarla. Dichiarare una variabile puntatore non è sufficiente. Ad esempio: char *p; Fa si che il compilatore riservi spazio sufficiente per una variabile puntatore, ma non alloca spazio per una stringa (come potrebbe? Non abbiamo indicato quanto dovrebbe essere lunga). Prima di poter utilizzare p come una stringa dobbiamo farla puntare a un vettore di caratteri oppure far puntare p a una stringa allocata dinamicamente (più avanti). char *p; p[0]= a ; /*** SBAGLIATO ***/ p[1]= b ; /*** SBAGLIATO ***/ p[2]= c ; /*** SBAGLIATO ***/ p[3]= \0 ; /*** SBAGLIATO ***/ Comportamento indefinito!!
11 Stringhe e caratteri Occorre notare la differenza fra stringhe costanti e costanti di tipo carattere: char ch a ; /* Per a è riservato un byte */ /* Vengono riservati due byte per a, oltre allo * spazio necessario alla memorizzazione di ps */ char *ps = a ; È possibile assegnare una costante carattere al contenuto di un puntatore a char; è invece scorretto effettuare la stessa operazione relativamente ad una stringa char *p1; *p1 = a ; /* OK */ *p1 = a ; /* not OK */ char *p2; p2 = a ; /* not OK */ p2 = a ;/* OK */
12 Stringhe e caratteri Le inizializzazioni e gli assegnamenti non sono simmetrici; è infatti possibile scrivere char *p string ; Puntatore a carattere ma non *p string ; Nota: vale per inizializzazioni ed assegnamenti di tutti i tipi di dati float f; float *pf &f; //OK *pf &f; // SBAGLIATO Carattere Puntatore a float Float
13 Puntatori e stringhe Due modi per dichiarare ed inizializzare una stringa: char str_array[] = Hello World! ; char *str_ptr = Hello World! ; Per quanto visto prima le seguenti espressioni: str_array[6] *(str_array+6) *(str_ptr+6) str_ptr[6] restituiscono tutte il carattere W.
14 Scrivere le stringhe Per stampare stringhe tramite printf() usare la specifica %s, anche specificando il numero di caratteri da stampare: char str[] "stringa di prova"; printf("%s\n", str); printf("%.6s\n", str); L argomento della funzione printf() deve essere un puntatore ad un array di caratteri terminato dal carattere nullo (che non viene stampato) Una stringa, come un numero, può essere stampata all interno di un campo usando la conversione %ms; in questo caso, una stringa con più di m caratteri verrà stampata per intero, una stringa con meno di m caratteri verrà allineata a destra all interno del campo (allineamento a sinistra: %-ms). La libreria C fornisce anche la funzione puts() che accetta come unico argomento la stringa che deve essere stampata e che avanza alla riga di output successiva dopo la stampa scrivendo un carattere new line. puts(str);
15 Leggere le stringhe Per leggere le stringhe tramite scanf() usare la specifica %s, essa salterà gli spazi bianchi e poi leggerà tutti i caratteri fino a un carattere che rappresenta uno spazio bianco memorizzandoli nel vettore. La scanf() mette sempre il carattere terminatore null alla fine della stringa. char str[20]; scanf("%s", str); Una stringa letta tramite la scanf() non conterrà mai degli spazi bianchi; quindi generalmente non viene usata per leggere un intera riga dell input. Per leggere un intera riga di input serve usare la funzione gets(): legge i caratteri di input, li memorizza nel vettore e alla fine aggiunge il terminatore. Ma: la gets() non salta gli spazi bianchi che precedono l inizio della stringa la gets() legge fino a quando trova new-line (la scanf() si ferma al primo carattere che rappresenta uno spazio bianco). La gets() scarta il carattere newline e al suo posto memorizza il terminatore di stringa.
16 Leggere le stringhe: esempio char sentence[sent_len+1]; printf("enter a sentence:\n"); scanf("%s", sentence); Se l utente inserirà la riga: Prova di inserimento di una riga di input la scanf() memorizzerà solo la stringa «Prova» nella variabile sentence. Un eventuale chiamata successiva alla scanf() riprenderà la lettura della riga dallo spazio successivo alla parola «Prova». Se invece leggiamo la stringa usando la funzione gets(): Attenzione alla dimensione del vettore; sia la scanf() che la gets() non hanno modo di stabilire quando sia pieno, rischiando di salvare dei caratteri oltre la fine del vettore e provocando un comportamento indefinito!! La scanf() può essere usata specificando il massimo numero di caratteri da memorizzare (%ms). printf("enter a sentence:\n"); gets(sentence); La gets() è intrinsecamente non sicura, la funzione fgets() è un alternativa decisamente migliore. A fronte dello stesso input, la gets() salverà all interno del vettore tutta la riga di input
17 fgets() E una versione più generale e più sicura della gets() poiché pone un limite al numero di caratteri che andrà a salvare. Esempio: //legge una riga da fp, str è un vettore di caratteri fgets(str, sizeof(str), fp); fgets() legge i caratteri fino a new-line o fino a che sono stati letti str-1 caratteri. Se incontra new-line la fgets() lo salva insieme agli altri caratteri (quindi gets() non salva mai il carattere new-line, fgets() lo fa qualche volta. Entrambe salvano il carattere NULL alla fine della stringa. Entrambe restituiscono un puntatore nullo nel caso si verifichi un errore di lettura, altrimenti restituiscono il loro primo argomento, il quale punta al vettore dove è stato salvato l input. Per leggere dallo stream di input standard: //legge una riga da fp, str è un vettore di caratteri fgets(str, sizeof(str), stdin); La gets() può essere usata quando abbiamo la certezza che il vettore sia correttamente dimensionato alla stringa che si sta leggendo.
18 Lettura e scrittura di stringhe: esempio Scrivere un programma che legga una stringa dalla periferica d ingresso di default e la stampi cento volte #include <stdio.h> #include <stdlib.h> #define MAX_CHAR 80 int main() { char str[max_char]; int i; } printf( Introdurre una stringa: ); scanf( %79s, str); for (i=0; i<100; i++) printf( %s\n, str); return 0;
19 Leggere le stringhe Scrivendo programmi per leggere le stringhe un carattere alla volta, possiamo eliminare la possibile fonte di errori della scanf() e della gets() garantendo un maggior controllo rispetto alle funzioni standard. Esempio: Data una stringa di caratteri, copiarla in un altro array di caratteri (di lunghezza non inferiore). Ipotesi: La stringa è ben formata, ossia correttamente terminata dal carattere \0. Algoritmo: scandire la stringa elemento per elemento, fino a trovare il terminatore \0 (che esiste certamente) nel fare ciò, copiare l elemento nella posizione corrispondente dell altro array
20 Esempio int main() { char s[] = "Nel mezzo del cammin di"; char s2[40]; int i; La dimensione deve essere tale da garantire che la stringa non «debordi» for (i=0; s[i]!='\0'; i++) s2[i] = s[i]; s2[i] = '\0'; return 0; } Al termine, occorre garantire che anche la nuova stringa sia ben formata, inserendo esplicitamente il terminatore
21 Attenzione Avremmo potuto fare diversamente? Perché non copiarla tutta in un colpo? Perché non fare così? int main() { char s[] = "Nel mezzo del cammin di"; } char s2[40]; s2 = s; return 0; Perché non dovrebbe funzionare??? ERRORE DI COMPILAZIONE: incompatible types in assignment
22 Esempio Problema: Data una stringa di caratteri, copiarla in un altro array di caratteri, con eventuale troncamento se la stringa è più lunga dell array dato. Algoritmo: scandire la stringa elemento per elemento, o fino a trovare il terminatore \0 (che esiste certamente), o fino alla lunghezza dell array di destinazione nel fare ciò, copiare l elemento nella posizione corrispondente dell altro array.
23 Esempio #define N 20 int main() { char s[] = "Nel mezzo del cammin di"; char s2[n]; int i; for (i=0; s[i]!='\0' && i<n-1; i++) s2[i] = '\0'; return 0; } s2[i]=s[i]; Si prosegue solo se non si è incontrato il terminatore e inoltre c è spazio nell array destinazione deve rimanere uno spazio per \0
24 Esempio Problema: Date due stringhe di caratteri, decidere quale precede l altra in ordine alfabetico. Rappresentazione dell informazione: poiché vi possono essere tre risultati usiamo un intero (negativo, zero, positivo) per distinguerli. Algoritmo: scandire uno ad uno gli elementi di uguale posizione delle due stringhe, o fino alla fine delle stringhe, o fino a che se ne trovano due diversi nel primo caso, le stringhe sono uguali nel secondo, sono diverse: confrontare i due caratteri così trovati, e determinare qual è il minore la stringa a cui appartiene tale carattere precede l altra
25 Esempio main() { char s1[] = "Sempre caro mi fu quell ermo colle"; char s2[] = " Sempre caro mi fu quell ermo colle, e questa siepe"; int i, stato; for (i=0; s1[i]!='\0' && s2[i]!='\0' && s1[i]==s2[i] ; i++) ; stato = s1[i]-s2[i]; } negativo s1 precede s2 positivo s2 precede s1 zero s1 è uguale a s2
26 La libreria string.h La libreria del C fornisce un ricco insieme di funzioni adatte a eseguire operazioni sulle stringhe. I prototipi di queste funzioni risiedono nell header string.h #include <string.h> La maggior parte di queste funzioni richiede almeno una stringa come argomento. I parametri costituiti da una stringa sono del tipo char * permettendo così che l argomento possa essere: Un vettore di caratteri Una variabile di tipo char * Una stringa letterale
27 string.h
28 string.h
29 Copia di una stringa #include <string.h> char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n); Copiano la stringa puntata da src nel vettore puntato da dest VALORE DI RITORNO: Le funzioni strcpy() e strncpy() ritornano il puntatore alla stringa di destinazione dest. DESCRIZIONE: La funzione strcpy() copia la stringa src sull'area puntata da dest la quale deve essere sufficientemente ampia da accogliere tutti i caratteri di src compreso il terminatore '\0'. La funzione strncpy() è simile alla funzione strcpy() eccetto che vengono copiati al più n caratteri. Attenzione: la strcpy() non ha modo di verificare che la stringa puntata da src possa essere effettivamente contenuta dal vettore puntato da dest. Se ciò dovesse succedere (cioè se vettore lungo n e stringa ha più di n-1 caratteri) si verificherebbe un comportamento indefinito; visto che la strcpy() copia sempre fino al primo carattere null, la funzione continuerà a copiare anche oltre la fine del vettore puntato da dest.
30 Copia di una stringa Esempio: char str1[10], str2[10]; str2= abcd ; strcpy(str2, abcd ); strcpy(str1, str2); //SBAGLIATO, quindi usiamo strcpy() //adesso str2 contiene abcd //non potendo fare str1=str2 strcpy(str1, strcpy(str2, abcd ); //sia str1 che str2 contengono abcd, //abbiamo sfruttato valore di ritorno della strcpy Usare strncpy() è un modo più sicuro di copiare una stringa: il terzo argomento limita il numero di caratteri che verrà copiato. Es.: strncpy(str1, str2, sizeof(str1)-1); str1[sizeof(str1)-1]= \0 ; Garantisce che str1 termini correttamente anche quando strncpy() non è in grado di copiare il carattere null dalla stringa str2 (quando la lunghezza di str2 >= lunghezza del vettore str1)
31 Lunghezza di una stringa #include <string.h> size_t strlen(const char *s); size_t: intero senza segno VALORE DI RITORNO: La funzione strlen() ritorna il numero di caratteri in s. DESCRIZIONE: La funzione strlen() calcola la lunghezza della stringa s, (inteso come il numero di caratteri dell'array puntato da s) escluso il terminatore '\0'.
32 Lunghezza di una stringa Esempi: int len; len=strlen( abc ); //a len assegnato il valore 3 len=strlen( ); //a len assegnato valore 0 strcpy(str1, abc ); len=strlen(str1); //a len assegnato valore 3 Quando alla strlen() viene passato un vettore come argomento, questa non misura la lunghezza del vettore ma la lunghezza della stringa in esso contenuta.
33 Concatenazione di stringhe #include <string.h> char *strcat(char *dest, const char *src); char *strncat(char *dest, const char *src, size_t n); VALORE DI RITORNO: Le funzioni strcat() e strncat() ritornano il puntatore alla stringa dest risultante. DESCRIZIONE: La funzione strcat() concatena la stringa src aggiungendola al termine della stringa dest. La concatenazione avviene copiando la stringa src a partire dal terminatore della stringa dest. La copia di src è comprensiva del suo terminatore. L'area di memoria puntata da dest deve essere sufficientemente ampia da accogliere entrambe le stringhe ed il terminatore '\0', quindi dest deve essere dimensionata almeno per contenere strlen(dest)+strlen(src)+1 caratteri. La funzione strncat() è simile alla funzione strcat() ad eccezione che al più n caratteri di src sono accodati a dest
34 Concatenazione di stringhe strcpy(str1, abc ); strcat(str1, def ); //str1 contiene abcdef strcpy(str1, abc ); strcpy(str2, def ); strcat(str1, str2); //str1 contiene abcdef strcpy(str1, abc ); strcpy(str2, def ); strcat (str1, strcat(str2, ghi )); char str1[6]= abc ; strcat(str1, def ); //str1 contiene abcdefghi, str2 contiene defghi //usando il valore restituito da strcat() //SBAGLIATO Usare strncat() è un modo più sicuro di concatenare stringhe: il terzo argomento limita il numero di caratteri che verrà copiato. Es.: L effetto di strcat() non è definito nel caso in cui il vettore puntato da str1 non sia lungo a sufficienza per contenere i caratteri aggiuntivi provenienti da str2. strncat(str1, str2, sizeof(str1)-strlen(str1) - 1); //spazio rimanente in str1-1
35 Comparazione fra stringhe #include <string.h> int strcmp(const char *s1, const char *s2); VALORE DI RITORNO: La funzione strcmp() ritorna un valore minore, uguale o maggiore di 0 a seconda che s1 sia minore, uguale o maggiore di s2. DESCRIZIONE: La strcmp() confronta la stringhe basandosi sul loro ordine lessicografico. Per confrontare i caratteri delle due stringhe strcmp() confronta i codici numerici che rappresentano i caratteri (0-9, A-Z, a-z, hanno codici consecutivi). Scegliendo l operatore relazionale o di uguaglianza appropriato, possiamo analizzare tutte le possibili relazioni esistenti fra s1 e s2.
36 Morris worm Nel 1988 Robert Morris svolgeva il primo anno del dottorato in informatica preso la Cornell University, dopo essersi laureato ad Harvard; grazie a questo aveva ottenuto un account per accedere ad Internet tramite il computer dell università. Nel tentativo di determinare le dimensioni di Internet, Morris lancia un programma C autoreplicante, il primo worm, che apriva una connessione con altre macchine in remoto per poi installarvicisi. Per un errore di programmazione il Morris Worm arrivó ad intasare circa il 10% dell allora Rete: quasi computer, tra cui sistemi universitari e governativi (computer appartenenti alla NASA, Pentagono, MIT, università di Berkeley e Stanford ) che rimasero offline per due giorni creando, di fatto, un nuovo livello di problemi di sicurezza informatica. Morris fu la prima persona condannata per violazione del Computer Fraud and Abuse Act, una legge approvata appena due anni prima: la sua pena consistette in tre anni di libertà condizionata, 400 ore di servizi socialmente utili e dollari di multa. Attualmente, Rober Morris insegna al MIT. Un worm é simile ad un virus, ma a differenza di quest ultimo non necessita di un file ospite a cui agganciarsi per agire e diffondersi sebbene provveda a modificare il computer che infetta, in modo da essere eseguito ad ogni avvio rimanendo costantemente attivo.
37 Morris worm WORM E un processo che sfrutta il meccanismo di generazione per minare le prestazioni del sistema; esso genera continuamente copie di sé stesso logorando le risorse, talvolta fino a rendere il sistema inutilizzabile da tutti gli altri processi. I worm sono potenti sulle reti di trasmissione perché hanno la possibilità di riprodursi sui diversi sistemi a esse collegati e quindi di far cadere l intera rete. Prima di entrare in un computer il worm verifica che non sia già presente una copia. Se una copia non è presente, il worm utilizza alcune falle di sicurezza dei sistemi Unix per installarsi sulla macchina. Una volta entrato nella macchina, individua in alcuni file di sistema gli indirizzi di altri calcolatori sulla rete e ripete il processo di replicazione su queste macchine. Se il worm è già presente sulla macchina, questa viene ignorata. Per aggirare alcuni semplici sistemi di protezione da parte di amministratori accorti, con probabilità 1 su 7, il worm prova in ogni caso ad infettare la macchina, anche se su questa è già presente. Il livello di replicazione risulta essere eccessivo: il worm si diffonde rapidamente, infettando alcune macchine più volte e rendendole in poco tempo inutilizzabili.
38 Morris worm Il Morris worm sfrutta alcune debolezze dei sistemi Unix nel 1988 (adesso risolte) e ingenuità da parte degli utenti (non risolte). Ad esempio, il worm sfrutta, fra gli altri, il bug caratteristico di molte funzioni di I/O presenti nelle librerie C che non controllano la dimensione dei buffer in gioco, permettendo di uscire dallo stack. I problemi di buffer overflow si verificano quando i dati scritti in un buffer corrompono anche i valori dei dati in indirizzi di memoria adiacenti a causa di insufficiente controllo dei limiti.. Le caratteristiche principali del warm sono: Utility finger. E una utility dei sistemi Unix che permette di ottenere informazioni sugli utenti attualmente connessi alla macchina (anche in remoto). L implementazione del demone fingerd in ascolto sulla macchina faceva uso della gets() per leggere le richieste in input. Il Morris worm sfruttava questa debolezza per mandare in overflow il buffer di lettura del demone. Utility sendmail. E una utility dei sistemi Unix per gestire la posta elettronica. Il Morris worm sfruttava una funzionalità di debugging di sendmail per eseguire dei comandi sulla macchina ospite. Password deboli. Il Morris worm include codice per decrittare password banali di utenti del sistema (riuscendoci con buona probabilità).
39 Morris worm Alcuni punti di attacco sfruttati dal Morris worm sono tutt ora validi: utenti che utilizzano password banali, software che faccia uso di gets() (deprecata ma ancora utilizzabile), o anche altre funzioni di libreria che non permettono di controllare la lunghezza del buffer su cui si effettuano operazioni di scrittura. I Buffer overflow devono quindi essere evitati mantenendo un elevato grado di correttezza nel codice che gestisce i buffer, ad esempio evitando funzioni della libreria standard che non operano controlli sui limiti, come gets(), scanf() e strcpy() o usando strncpy() invece di strcpy() per limitare i bordi del buffer. In particolare, Morris sovrascrisse buffer di 512 character con 536 caratteri; i 24 extra contenevano il programma eseguibile.
40 Morris worm Esempio: int main() { int buffer[10];. buffer[20]=5; } La zona di memoria buffer viene creata nello stack ed è temporanea per la funzione main Non viene effettuato alcun tipo di controllo di dimensione L assegnamento del valore 5 sovrascrive eventuali altri dati già presenti nello stack.
41 Morris worm Ad ogni chiamata di funzione, nello stack vengono collocati: Indirizzo di ritorno Eventuali argomenti della funzione Eventuali dati locali L uso di funzioni di libreria deboli che non controllano la dimensione dei loro argomenti può provocare un buffer overflow.
42 Morris worm L idea generale è quella di riempire il buffer: con codice maligno Un nuovo indirizzo di ritorno che punti a tale codice maligno
43 Calcolo dell età /* Esempio di conversione da stringa ad intero */ #include <stdio.h> #include <stdlib.h> int main() { char anno_nascita[5], anno_corrente[5]; int anni; printf( Inserire l anno di nascita: ); scanf( %s, anno_nascita); printf( Inserire l anno corrente: ); scanf( %s, anno_corrente); //Esempio uso atoi() #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int val; char str[20]; strcpy(str, " "); val = atoi(str); printf("string value = %s, Int value = %d\n", str, val); strcpy(str, "stringa di prova"); val = atoi(str); printf("string value = %s, Int value = %d\n", str, val); return(0); } } /* atoi() converte una stringa in un intero */ anni = atoi(anno_corrente) - atoi(anno_nascita); printf( Età: %d\n, anni); return 0;
44 Parole nella stringa /* Conta il numero di parole in una stringa */ #include <stdio.h> #include <ctype.h> int main() { char *s; } s=" Stringa di prova"; int count=0; while (*s!=`\0 ) { while (isspace(*s)) /* salta la spaziatura */ s++; if (*s!=`\0 ) /* trovata una parola */ { count++; while (!isspace(*s) && *s!=`\0 ) s++; /* salta la parola */ } } //Esempio di uso di isspace() //prototipo int isspace(int c); #include <stdio.h> #include <ctype.h> int main() { int ch; printf(«il numero di parole di cui è composta la frase e : %d\n",count); return 0; ch=getchar(); if( isspace(ch) ) printf("ch = %c is a white-space \n", ch); else printf("ch = %c is not a white-space \n", ch); return(0); }
45 Parole palindrome /* Letta in input una stringa, verifica se è palindroma */ include <stdio.h> include <string.h> #define MAXSTR 30 int main() { char parola[maxstr+1]; int i 0, n; } printf( Inserisci una parola (lunga al max %d caratteri):, MAXSTR); scanf( %MAXSTRs, parola); n strlen(parola); while ((i n/2) && (parola[i] parola[n 1 i])) i ; if (i n/2) printf( La parola %s è palindroma.\n, parola); else printf( La parola %s non è palindroma.\n, parola); return 0;
46 Da minuscole a maiuscole /* Letta in input una stringa alfabetica, la riscrive utilizzando solo lettere maiuscole*/ include <stdio.h> include <string.h> int main() { char s[100], t[100]; int i; printf( Inserisci una stringa: ); scanf( %99s, s); for (i 0; i strlen(s); i ) { if (s[i] 97 && s[i] 122) t[i] s[i] 32; else t[i] s[i]; } t[i]='\0'; printf( Stringa maiuscola: %s\n, t); retrun 0; } Si può far di meglio? Per piccole stringhe non si nota la differenza, ma se le stringhe rappresentassero, ad esempio, la sequenza genetica del DNA (milioni di caratteri), sarebbe preferibile calcolare una sola volta la lunghezza fuori dal ciclo // in alternativa: for (i 0; i strlen(s); i ) t[i]=toupper(s[i]); t[i]='\0'; printf("stringa maiuscola: %s\n", t);
47 Progetto di programmazione leggi riga Scrivere un programma C che legga una riga di input saltando tutti gli spazi bianchi prima di iniziare a salvare i caratteri di input. include <stdio.h> include <ctype.h> #define STR_LEN 100 int main() { int ch, i = 0; char str[str_len+1]; while ((ch = getchar())!= '\n') if (i == 0 && isspace(ch)) ; /* ignore */ else if (i < STR_LEN) str[i++] = ch; str[i] = '\0'; return 0; } //Esempio uso getchar() //getchar() returns the character read as an unsigned char //cast to an int or EOF on end of file or error #include <stdio.h> int main () { char c; printf("enter character: "); c = getchar(); printf("character entered: "); putchar(c); return(0); }
48 Progetto di programmazione leggi riga Scrivere un programma C che legga una riga di input interrompendosi al primo carattere bianco. include <stdio.h> include <ctype.h> #define STR_LEN 100 int main() { int ch, i = 0; char str[str_len+1]; while (!isspace(ch = getchar())) if (i < STR_LEN) str[i++] = ch; str[i] = '\0'; return 0; }
49 Progetto di programmazione leggi riga Scrivere un programma C che legga una riga di input interrompendosi non appena si incontra un carattere new-line. include <stdio.h> #define STR_LEN 100 int main() { int ch, i = 0; char str[str_len+1]; do { ch = getchar(); if (i < STR_LEN) str[i++] = ch; } while (ch!= '\n'); str[i] = '\0'; return 0; }
50 Progetto di programmazione leggi riga Scrivere un programma C che legga una riga di input in modo che i caratteri per i quali non c è spazio vengano lasciati al loro posto. include <stdio.h> #define STR_LEN 100 int main() { int ch, i = 0; char str[str_len+1]; for (i = 0; i < STR_LEN; i++) { ch = getchar(); if (ch == '\n') break; str[i] = ch; } str[i] = '\0'; return 0; } Attenzione: possibili errori quali??
51 Progetto di programmazione leggi/sostituisci Scrivere un programma C che modifichi una stringa rimpiazzando ogni occorrenza di «new» con «old». include <stdio.h> #define STR_LEN 100 int main() { int, i; char str[str_len+1]; for (i = 0; str[i]!= '\0 && i<str_len-1; i++) if (str[i] == n' && str[i+1] == e' && str[i+2] == w') { str[i] = o ; str[i+1] = l ; str[i+2] = d'; } }
52 Progetto di programmazione promemoria Scrivere un programma C che stampi l elenco dei promemoria giornalieri di un mese. L utente immette una serie di note, ognuna associata a un giorno del mese; quando l utente immette uno 0 invece di un giorno valido, il programma stampa la lista di tutti i promemoria immessi, ordinati per giorno. Esempio: input: Enter day and remind: 24 compleanno Ele Enter day and remind: cena con Luca Enter day and remind: appuntamento dentista Enter day and remind: verifica progetto Enter day and remind: 0 output: Day reminder: cena con Luca verifica progetto appuntamento dentista 24 compleanno Ele
53 Progetto di programmazione promemoria #include <stdio.h> #include <string.h> #define MAX_REMIND 50 /* maximum number of reminders */ #define MSG_LEN 60 /* max length of reminder message */ int main(void) { char reminders[max_remind][msg_len+1]; char day_str[3], msg_str[msg_len+1]; int ch, day, i, j, num_remind = 0; for (;;) { if (num_remind == MAX_REMIND) { printf("-- No space left --\n"); break; } // CONTINUA
54 Progetto di programmazione promemoria // CONTINUA printf("enter day and reminder: "); //legge i giorni scanf("%2d", &day); if (day == 0) break; sprintf(day_str, "%2d", day); //converte il giorno in una stringa e lo scrive in day_str con \0 i = 0; while ((ch = getchar())!= '\n') if (i < MSG_LEN) msg_str [i++] = ch; msg_str [i] = '\0'; //legge i promemoria for (i = 0; i < num_remind; i++) if (strcmp(day_str, reminders[i]) < 0) break; for (j = num_remind; j > i; j--) strcpy(reminders[j], reminders[j-1]); // CONTINUA
55 Progetto di programmazione promemoria // CONTINUA strcpy(reminders[i], day_str); strcat(reminders[i], msg_str); num_remind++; }//for printf("\nday Reminder\n"); for (i = 0; i < num_remind; i++) printf(" %s\n", reminders[i]); return 0; }
56 Sostituisci carattere Nota: ricordarsi il controllo sulla dimensione del buffer.
57 Sostituisci carattere #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDIM 100 caratteri gestibile da programma int main (void) { char frase[maxdim+1]; char frasemodificata[maxdim+1]; int lung_stringa; int i; //stringa di caratteri inserita //nuova stringa modificata //LEGGI FRASE INSERITA DA TASTIERA printf("inserisci una frase composta al massimo di %d caratteri\n", MAXDIM); gets(frase); //CALCOLA LA LUNGHEZZA DELLA FRASE lung_stringa=strlen(frase); //STAMPA LA FRASE INSERITA printf("la frase inserita e' : "); puts(frase); printf("la frase contiene %d caratteri (inclusi gli spazi) \n)", lung_stringa); //CONTINUA La gets() legge la sequenza di caratteri dallo stdin, fino a quando non incontra newline o EOF, e inserisce i caratteri all'interno dell'array nome, aggiungendo come ultimo carattere il carattere nullo. La puts() Scrive una stringa su stdout sostituendo il carattere nullo '\0' //dimensione massima stringa di presente alla fine della stringa, e che contraddistingue la fine della stringa, con il carattere newline '\n'.
58 Sostituisci carattere //ANALIZZA LA FRASE INSERITA CARATTERE PER CARATTERE, //RICOPIA LA FRASE NELLA NUOVA STRINGA. //SE LA STRINGA INSERITA CONTIENE IL CARATTERE "." SOSTITUISCILO CON IL CARATTERE \n for(i=0;i<lung_stringa;i++){ if (frase[i]=='.') frasemodificata[i]='\n'; else frasemodificata[i]=frase[i]; } frasemodificata[lung_stringa]='\0'; } //STAMPA FRASE MODIFICATA printf("la frase modificata e' : \n"); puts(frasemodificata); return 0;
59 Parola palindroma
60 Parola palindroma #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXDIM 30 int main (void) { char parola[maxdim+1]; int numcaratteri; int palindroma; int i,j; //dimensione massima stringa di caratteri gestibile //stringa di cartteri inserita //flag per la ricerca
61 Parola palindroma //LEGGI LA STRINGA DI CARATTERI INSERITA DA TASTIERA printf("inserisci una parola composta al massimo di %d caratteri\n", MAXDIM); scanf("%s", parola); //VISUALIZZA LA STRINGA DI CARATTERI INSERITA printf("la parola inserita e' %s\n", parola); //CALCOLA IL NUMERO DI CARATTERI DELLA STRINGA numcaratteri=strlen(parola); printf("la parola contiene %d caratteri\n", numcaratteri); //CONVERTI TUTTI I CARATTERI DELLA STRINGA IN CARATTERI MINUSCOLI for(i=0;i<numcaratteri;i++) parola[i]=tolower(parola[i]); //VISULAIZZA STRINGA DOPO LA CONVERSIONE printf("la parola modificata e' : %s\n", parola);
62 Parola palindroma //VERIFICA SE LA STRINGA E' PALINDROMA palindroma=1; for(i=0,j=numcaratteri-1;i<numcaratteri/2 && palindroma; i++,j--) if(parola[i]!=parola[j]) palindroma=0; } //STAMPA RISULTATO palindroma? printf("la parola è palindroma\n"):printf("la parola non è palindroma\n"); return 0;
63 Character Classification Functions
64 Verifica caratteri in una stringa Scrivere un programma C che stampi quante cifre, lettere e caratteri di punteggiatura sono presenti in una stringa inserita da tastiera. Esempio: input: Enter an interesting string of less than 100 characters: I was born on the 3rd of October 1895, which is long ago. output: Your string contained 38 letters, 5 digits and 2 punctuation characters.
65 Verifica caratteri in una stringa #define STDC_WANT_LIB_EXT1 1 // Make optional versions of functions available #include <stdio.h> #include <ctype.h> #define BUF_SIZE 100 int main(void) { char buf[ BUF_SIZE]; int nletters = 0; int ndigits = 0; int npunct = 0; // Input buffer // Number of letters in input // Number of digits in input // Number of punctuation characters printf("\nenter an interesting string of less than %d characters:\n", BUF_SIZE); gets_s(buf, sizeof(buf)); // Read a string into buffer //CONTINUA
66 Verifica caratteri in una stringa size_t i = 0; // Buffer index while(buf[i]) { if(isalpha(buf[i])) ++nletters; // Increment letter count else if(isdigit(buf[i])) ++ndigits; // Increment digit count else if(ispunct(buf[i])) ++npunct; ++i; } printf("\nyour string contained %d letters, %d digits and %d punctuation characters.\n", nletters, ndigits, npunct); return 0; }
67 Strings to Numerical Values
68 Vettori di stringhe Come memorizzare un vettore di stringhe? Potremmo creare un vettore bidimensionale di caratteri e poi memorizzare le stringhe all interno del vettore, una per riga. Esempio: char planets[][8]= {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto" } Siccome non tutte le stringhe sono lunghe a sufficienza per occupare un intera riga del vettore, il C le riempe con caratteri null, sprecando così spazio (la stessa cosa avviene nel programma per la stampa dei promemoria). Quello di cui abbiamo bisogno è un vettore frastagliato, in cui le righe possano avere lunghezza diversa fra di loro. Possiamo crearli utilizzando vettori i cui elementi siano puntatori a stringhe.
69 Vettori di stringhe Vettore di puntatori a stringa. Esempio: char *planets[] = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto" } L effetto sul modo in cui viene memorizzato il vettore è sostanziale. Ogni elemento di planets è un puntatore a una stringa terminante con null. Nelle stringhe non ci sono più sprechi di memoria, sebbene ora serva spazio per allocare anche i puntatori. Per accedere a uno dei nomi dei pianeti, basterà indicizzare il vettore planets. Grazie alla relazione fra vettori e puntatori, si accederà ai caratteri nello stesso modo nel quale si accede a un elemento di un vettore bidimensionale. Esempio: for (i=0;i<9;i++) if (planets[i][0]== M ) printf(( %s begins with M\n, planets[i]);
LE STRINGHE. Manuale linguaggio C
LE STRINGHE Manuale linguaggio C Le stringhe Non esiste un tipo specifico per le stringhe; esse si rappresentano con un vettore di caratteri. Es. Hello World è: H e l l o \s W o r l d \0 Nella rappresentazione
Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0
STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1
STRINGHE: ARRAY DI CARATTERI! a p e \0
STRINGHE: ARRAY DI CARATTERI! Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più
RIPRENDIAMO I PUNTATORI
RIPRENDIAMO I PUNTATORI Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 =&a Esistono in C particolari variabili dette
Caratteri e stringhe
Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un
Linguaggio C: Stringhe Valeria Cardellini
Linguaggio C: Stringhe Valeria Cardellini Corso di Calcolatori Elettronici A.A. 2018/19 Università degli Studi di Roma Tor Vergata Dipartimento di Ingegneria Civile e Ingegneria Informatica Argomenti q
Caratteri e stringhe
Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un
Introduzione al C. Unità 8 Stringhe. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 8 Stringhe S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi Sommario
Esercizio 1: funzione con valore di ritorno di tipo puntatore
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio
Tipi strutturati in C. Stringhe
Tipi strutturati in C Stringhe Stringhe Una stringa di caratteri in C è un array di caratteri terminato dal carattere \0 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1 caratteri,
Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>
Ricerca di un elemento in vettore Scrivere un programma in linguaggio C che riceve in ingresso una sequenza di N numeri interi. I numeri sono memorizzati in un vettore. Il valore N è inserito dall utente,
Introduzione al C. Unità 8 Stringhe
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 8 Stringhe D. Bloisi, A. Pennisi, S. Peluso, S. Salza Sommario Unità 8 Array di
STRINGHE: ARRAY DI CARATTERI STRINGHE: ARRAY DI CARATTERI. a p e \0
STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1
C: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
Lezione 8: Stringhe ed array multidimensionali
Lezione 8: Stringhe ed array multidimensionali Vittorio Scarano Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione AVVISO: la lezione di laboratorio di 28/5 non si
Introduzione al linguaggio C Puntatori
Introduzione al linguaggio C Puntatori Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 19 ottobre 2017
ELEMENTI DI INFORMATICA. Linguaggio C
Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica ELEMENTI DI INFORMATICA http://agile.diee.unica.it A.A. 2015/2016 Ing. Marco Ortu Diee, secondo piano Tel. 070-6755774 mail:
Stringhe in C. Emilio Di Giacomo
Stringhe in C Emilio Di Giacomo Stringhe Una stringa è una sequenza finita di caratteri Le stringhe sono un tipo di dati talmente importante e utile che fanno parte di quasi tutti i linguaggi di programmazione
Esercitazione di Reti degli elaboratori
Esercitazione di Prof.ssa Chiara Petrioli Christian Cardia, Gabriele Saturni Cosa vedremo in questa lezione? Gli Array Gli array multidimensionali Le stringhe I puntatori Esercizi Pagina 1 Gli Array Definizione
Stringhe in C. Luca Abeni. Informatica Luca Abeni 1 / 10
Stringhe in C Luca Abeni Informatica Luca Abeni 1 / 10 Stringhe in C Stringhe: tipo di dato strutturato Sequenze di caratteri Linguaggio C: progettato per la semplicità No supporto nativo per le stringhe
Linguaggio C - Array. Array: tipo nome_array[num_elementi]
Linguaggio C - Array Array: Gli array o vettori sono delle strutture dati in grado di contenere un insieme di valori tutti dello stesso tipo. Un array lo possiamo immaginare come un contenitore suddiviso
I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore
I puntatori Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore...... L operatore & fornisce l indirizzo di un oggetto: p = &c; assegna a p l indirizzo di c, i.e., p
Stringhe e allocazione dinamica della memoria
Stringhe e allocazione dinamica della memoria Esercizio Scrivere un programma strings.c che legge da standard input una sequenza di parole separate da uno o più spazi, e stampa le parole lette, una per
Tipi di dato STRUTTURATI
Tipi di dato STRUTTURATI I tipi di dato si differenziano in scalari e strutturati In C si possono definire tipi strutturati: array e strutture [ ] (array) Un array è una collezione finita di N variabili
Introduzione al C. Unità 8 Stringhe. D. Bloisi, S. Peluso, A. Pennisi, S. Salza
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 8 Stringhe D. Bloisi, S. Peluso, A. Pennisi, S. Salza Sommario Unità 8 Array di
Puntatori e array. Violetta Lonati
Puntatori e array Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati Puntatori e array
Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
Operazioni sulle stringhe
Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto
Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
Uso avanzato dei puntatori Allocazione dinamica della memoria
Uso avanzato dei puntatori Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica
Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.
Operatori di incremento e decremento ++ e -- Esempi y=x++ il contenuto della variabile x viene inizialmente usata per l assegnazione y, e solo dopo incrementata y=--x il contenuto della variabile x viene
Le stringhe. Le stringhe sono sequenze di caratteri,
Stringhe Le stringhe Le stringhe sono sequenze di caratteri, in C le stringhe costanti vengono denotate da una successione di caratteri racchiusa fra apici Es: "ciccio" "n = %d" "Ciao Mondo" La rappresentazione
Stringhe in C. Nicu Sebe. Informatica Nicu Sebe 1 / 14
Stringhe in C Nicu Sebe Informatica Nicu Sebe 1 / 14 Stringhe in C Stringhe: tipo di dato strutturato Sequenze di caratteri Linguaggio C: progettato per la semplicità No supporto nativo per le stringhe
Le stringhe. Le stringhe sono sequenze di caratteri,
Stringhe Le stringhe Le stringhe sono sequenze di caratteri, in C le stringhe costanti vengono denotate da una successione di caratteri racchiusa fra apici Es: "ciccio" "n = %d" "Ciao Mondo" La rappresentazione
Allocazione dinamica della memoria
Allocazione dinamica della memoria Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati
Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso
Introduzione al C Lezione 4 Allocazione dinamica della memoria Rossano Venturini rossano@di.unipi.it Pagina web del corso http://didawiki.cli.di.unipi.it/doku.php/informatica/all-b/start Lezioni di ripasso
Introduzione al linguaggio C Primi programmi
Introduzione al linguaggio C Primi programmi Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica
I CARATTERI E LE STRINGHE
I CARATTERI E LE STRINGHE IL CODICE ASCII Per memorizzare i simboli grafici corrispondenti ai caratteri bisogna associare un numero intero a ciascuno di essi Il codice ASCII / æski/ (American Standard
Gestione dei File. Credits Prof. Campi
Gestione dei File Credits Prof. Campi 1 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi Si usano dall'interno dei programmi Realizzano la persistenza dei dati cioè
Stringhe. Unità 8. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi
Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto
Lezione XI Le stringhe
Programmazione e Laboratorio di Programmazione Lezione XI Le stringhe Programmazione e Laboratorio di Programmazione: Le stringhe 1 Premessa: Il tipo char Dimensione: 1 byte Range: da 0 a 255 Definizione:
Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari
Input/Output Lettura e scrittura Caratteri e Stringhe: Terminale e file Input/output console file caratteri stringhe formattato ascii binari Linguaggio ANSI C Input/Output - 1 La libreria standard del
i Vettori Alessandra Giordani Lunedì 15 aprile
i Vettori Alessandra Giordani agiordani@disi.unitn.it Lunedì 15 aprile 2013 http://disi.unitn.it/~agiordani/ Dichiarazione di un Array La dichiarazione di un array di n elementi di tipo T causa l'allocazione
Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012
Stringhe in C Alessandra Giordani agiordani@disi.unitn.it Lunedì 23 aprile 2012 http://disi.unitn.it/~agiordani/ Stringhe Sono particolari array: Ogni elemento del vettore è di tipo char La stringa è terminata
I/O da tastiera e direttive processore. Alessandra Giordani Lunedì 3 maggio
I/O da tastiera e direttive processore Alessandra Giordani agiordani@disi.unitn.it Lunedì 3 maggio 2010 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una
Stringhe. Concetti chiave
Concetti chiave Stringhe Variabili strutturate: array di caratteri Carattere di fine stringa Copiare, concatenare, confrontare e convertire stringhe Funzioni standard strcpy, strcat, strcat, strcmp, atoi,
Corso di Laboratorio di Sistemi Operativi A.A
Corso di Laboratorio di Sistemi Operativi A.A. 2016 2017 Lezione 10 Ivan Scagnetto ivan.scagnetto@uniud.it Nicola Gigante gigante.nicola@spes.uniud.it Dipartimento di Scienze Matematiche, Informatiche
Primi programmi in C
Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica In breve Uso del compilatore gcc Struttura di un programma
Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi
Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi gianluca.rossi@uniroma2.it Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Array e stringhe. Marco D. Santambrogio Ver. aggiornata al 28 O0obre 2014
Array e stringhe Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 28 O0obre 2014 Frase insieme di caratteri Che cosa è una frase? Un insieme di caratteri Come la rappresento? Un insieme,
INPUT E OUTPUT DI VALORI NUMERICI
INPUT E OUTPUT DI VALORI NUMERICI FUNZIONI DI I/O PER NUMERI Per utilizzare le funzioni di Input/Output bisogna includere il file di intestazione (header file) denominato contiene la
Ingresso ed Uscita in C. Informatica 1 / 15
Ingresso ed Uscita in C Informatica 1 / 15 Input e Output in C Linguaggio C: progettato per essere semplice e con poche istruzioni Non esistono istruzioni di ingresso / uscita (I/O)!!! Ingresso ed uscita
Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin
Linguaggio C Vettori, Puntatori e Funzioni Stringhe Università degli Studi di Brescia Prof. Massimiliano Giacomin SCHEMA DELLA LEZIONE RELAZIONE TRA VETTORI E PUNTATORI (e le stringhe letterali come caso
char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1
char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; 1 Libreria sulle stringhe La libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra
Introduzione alla programmazione in linguaggio C
Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008
Programmazione I - Laboratorio
Programmazione I - Laboratorio Esercitazione 4 - Puntatori, vettori e stringhe Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti
Introduzione al linguaggio C Dati aggregati
Introduzione al linguaggio C Dati aggregati Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 5 ottobre
Stringhe. Prof. Lorenzo Porcelli
Stringhe Prof. Lorenzo Porcelli definizione Una stringa è un vettore di caratteri terminato dal carattere nullo \0. Il carattere nullo finale permette di determinare la lunghezza della stringa. char vet[32];
Corso di Informatica A.A
Corso di Informatica A.A. 2009-2010 Lezione 11 Corso di Informatica 2009-2010 Lezione 11 1 Utilizzo dei puntatori Funzioni Perche i Puntatori? I puntatori hanno tre importanti applicazioni: 1. Passaggio
Variabili e input/ Alessandra Giordani Lunedì 18 marzo
Variabili e input/ output da tastiera Alessandra Giordani agiordani@disi.unitn.it Lunedì 18 marzo 2013 http://disi.unitn.it/~agiordani/ Es. compilazione helloworld.c 2 Variabili e valori Una variabile
Introduzione al C Lez. 4
Introduzione al C Lez. 4 Allocazione Dinamica della memoria http://www.di.unipi.it/~rossano/algo1/lez4.pdf Allocazione dinamica memoria In C la memoria può essere anche gestita in modo dinamico, attraverso
I/O da tastiera + Alessandra Giordani Lunedì 2 maggio
I/O da tastiera + costrutti while e if Alessandra Giordani agiordani@disi.unitn.it Lunedì 2 maggio 2011 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una
(Def. funzioni con parametri di tipo matrice)
ESERCIZIO 1 (Def. funzioni con parametri di tipo matrice) Scrivere un sotto-programma in linguaggio C++ che ricevuta una matrice quadrata come parametro restituisca al chiamante un valore booleano indicante
s r t i r n i g n. g h s r t c r p c y s r t c r a c t s r t c r m c p s r t c r h c r s r t s r t s r
char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; 1 Libreria sulle stringhe La libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra
I files in C. A cura del prof. Ghezzi
I files in C A cura del prof. Ghezzi 1 Perchè i files? Realizzano la persistenza dei dati dati che sopravvivono all esecuzione del programma Sono delle strutture di dati sequenziali 2 Files e S.O. I files
Dati aggregati. Violetta Lonati
Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica - in breve: Definizione di tipi Array Stringhe Strutture
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO IV.2019
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2018 2019 17.IV.2019 VINCENZO MARRA Indice Esercizio 1 2 Funzione reverse 2 2 Esercizio 2 2 Funzione equals
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h
Corso di Linguaggi e Traduttori 1 AA 2004-05 1 Corso di Linguaggi e Traduttori 1 AA 2004-05 stdio.h 2 Funzioni comuni di I/O? Le piu' comuni funzioni che permettono I/O sono getchar() e putchar():? int
string.h strcpy strc strcat strcmp strcmp strchr strstr strstr i t r ; s r \0 int strlen(char* str) char pippo[]={ p, i, p, p, o, \0 \ };
char* titolo= l, e,, s, t, r, i, n, g, h, e, \0 ; Libreria sulle stringhe libreria i string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra (strcpy
Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.
Consideriamo l esercizio assegnato la scorsa lezione per rappresentare il libretto di uno studente. Per memorizzare i dati si sono utilizzati tre array: char* nomiesami[max ESAMI] Array dei nomi degli
Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati
Introduzione al C Ancora puntatori, allocazione dinamica, e tipi derivati 1 Array di caratteri Non esiste in C un tipo di dato predefinito per le stringhe Le stringhe sono rappresentate come array di caratteri.
Gli array. slides credit M. Poneti
Gli array slides credit M. Poneti Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome e lo
Librerie Stringhe. Librerie e stringhe. Lezione 9. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A. 2015/2016
e stringhe Lezione 9 Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2015/2016 Calendario delle lezioni Lezione 1 (7 e 9/10/2015) - Introduzione all ambiente Linux Lez. 2 (14 e 16/10/2015)
RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio
RICORSIONE, PUNTATORI E ARRAY Quarto Laboratorio 16 DICEMBRE 2011 SCADENZA TERZA ESERCITAZIONE FUNZIONI RICORSIVE ESERCIZIO Scrivere una funzione ricorsiva che, assegnati due interi N1 ed N2, restituisca
A. Ferrari. stringhe di caratteri In linguaggio C
stringhe di caratteri In linguaggio C stringhe o un insieme di caratteri in sequenza forma una stringa o alcuni linguaggi definiscono per le stringhe uno specifico tipo di dato e offrono metodi specifici
Esercizi. Stringhe. Stringhe Ricerca binaria
Politecnico di Milano Esercizi Stringhe Stringhe Array di caratteri Funzioni: strcpy() strcmp() strlen() char stringaa[10], stringab[10]; strcpy(stringaa, stringab); Copia if (strcmp(stringaa, stringab)
char* titolo= { l, e,, s, t, r, i, n, g, h, e, \0 };
char* titolo= { l, e,, s, t, r, i, n, g, h, e, \0 }; 1 Libreria sulle stringhe libreria string.h contiene una ricca serie di funzioni per operare sulle stringhe Esempi: copiare una stringa in un altra
Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:
Variabili locali Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. void leggivettore(int v[], int dim) int i; /* i E UNA VARIABILE LOCALE */ for (i
Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018
Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018 Esercizi sull allocazione dinamica della memoria in C Il codice di questi esercizi é contenuto nella cartella parte1 1. Implementare una lista
Stringhe. Una stringa è una sequenza di caratteri. Esempi: printf( Sum = %d, s); #define ERR_PREFIX ***** Error -
Stringhe dichiarazione e input/output assegnamento e sottostringhe concatenazione confronto array di puntatori a stringhe input/output, analisi e conversione di caratteri conversione da stringa a numero
Introduzione al C Lez. 4. Allocazione Dinamica della memoria
Introduzione al C Lez. 4 Allocazione Dinamica della memoria Allocazione dinamica memoria In C la memoria può essere anche gestita in modo dinamico, attraverso l allocazione esplicita di blocchi di memoria
Capitolo 3. Input/Output formattato
1 Capitolo 3 Input/Output formattato 2 La funzione printf Per stampare i valori di variabili con printf dobbiamo specificare un stringa di formato seguita dai valori che devono essere inseriti nella stringa:
Gestione dei file in C
Gestione dei file in C Fondamenti di Informatica Che cos è un file e a cosa serve? Memoria di massa vs memoria centrale q La memoria di massa (disco fisso) è un dispositivo di memorizzazione generalmente
Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 5 31/10/2013
Laboratorio di Programmazione 1 1 Docente: dr. Damiano Macedonio Lezione 5 31/10/2013 Original work Copyright Sara Migliorini, University of Verona Modifications Copyright Damiano Macedonio, University
Librerie C. Corso di Linguaggi e Traduttori 1 AA
Corso di Linguaggi e Traduttori 1 AA 2004-05 1 Corso di Linguaggi e Traduttori 1 AA 2004-05 stdio.h 2 Funzioni comunidi I/O? Le piu' comuni funzioni che permettono I/O sono getchar() e putchar():? int
Esercizio 1 (15 punti)
Esercizio 1 (15 punti) Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 16 giugno 2017 Il noto gioco MasterMind
C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.
Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. Non sappiamo a priori quante variabili dobbiamo definire per contenere gli interi.
Streams e disk files
Streams e disk files Streams Un canale è una sequenza di byte di dati Sorgente o destinazione di dati che possono essere associati ad un disco o ad altre periferiche Due tipi di stream: Testo: sequenza
Laboratorio di Programmazione
Laboratorio di Programmazione (Laurea triennale in matematica) Lezione 26 Sommario: Gestione dei file in C. File ad accesso sequenziale: apertura, chiusura, lettura e scrittura. File binari. Gestione files
Dispensa 13 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratorio
CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA CORSO DI PROGRAMMAZIONE A.A. 2014-15 Dispensa 13 Laboratorio Dott. Mirko Ravaioli e-mail: mirko.ravaioli@unibo.it http://www.programmazione.info
Programmazione C Massimo Callisto De Donato
Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto LEZIONE