Le stringhe. Le stringhe sono sequenze di caratteri,

Documenti analoghi
Le stringhe. Le stringhe sono sequenze di caratteri,

Le stringhe. Le stringhe sono sequenze di caratteri,

Il linguaggio C. Puntatori e dintorni

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Caratteri e stringhe

Caratteri e stringhe

Linguaggio C: Stringhe Valeria Cardellini

STRINGHE: ARRAY DI CARATTERI! a p e \0

RIPRENDIAMO I PUNTATORI

Stringhe in C. Luca Abeni. Informatica Luca Abeni 1 / 10

Introduzione al C. Unità 8 Stringhe. S. Salza, C. Ciccotelli, D. Bloisi, S. Peluso, A. Pennisi

Stringhe in C. Nicu Sebe. Informatica Nicu Sebe 1 / 14

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Lezione XI Le stringhe

Introduzione al C. Unità 8 Stringhe

Introduzione al C. Ancora puntatori, allocazione dinamica, e tipi derivati

Lezione 8: Stringhe ed array multidimensionali

Il linguaggio C. Breve panoramica su stdio.h

Linguaggio C - Stringhe

Dispensa 13 CORSO DI PROGRAMMAZIONE A.A CORSO DI LAUREA IN INGEGNERIA E SCIENZE INFORMATICHE CESENA. Laboratorio

Introduzione al C. Unità 8 Stringhe. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

A. Ferrari. stringhe di caratteri In linguaggio C

C: panoramica. Violetta Lonati

Stringhe. Concetti chiave

Il linguaggio C Gestione della memoria

Dati due punti sul piano calcolare la loro distanza

Array. Aggragati di variabili omogenee...

Laboratorio di Algoritmi e Strutture Dati

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Operazioni sulle stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Operazioni sulle stringhe

i Vettori Alessandra Giordani Lunedì 15 aprile

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Stringhe. Unità 8. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

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 \ };

I/O da tastiera e direttive processore. Alessandra Giordani Lunedì 3 maggio

Introduzione al C Lez. 4

Allocazione dinamica della memoria

La gestione della memoria dinamica Heap

Stringhe in C. Emilio Di Giacomo

Corso di Informatica A.A

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

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

char* titolo= Libreria sulle stringhe Esempi: (strcpy) (strstr)... Laboratorio di Informatica L-A 1

Il blocco che costituisce il corpo di una funzione/procedura può contenere dichiarazioni di variabili. Esempio:

char* titolo= { l, e,, s, t, r, i, n, g, h, e, \0 };

Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe

Uso avanzato dei puntatori Allocazione dinamica della memoria

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Corso di Laboratorio di Sistemi Operativi A.A

Librerie Stringhe. Librerie e stringhe. Lezione 9. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A. 2015/2016

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

ELEMENTI DI INFORMATICA. Linguaggio C

Programmazione I - Laboratorio

Il linguaggio C. Puntatori e dintorni

Esercitazioni Fondamenti di Informatica

Gestione di stringhe. Le stringhe in C/C++

I CARATTERI. Domanda: char c = 1 ; printf( c=%d\n, (int)c ); //cosa stampa?

Esercitazione di Reti degli elaboratori

Stringhe e allocazione dinamica della memoria

Sulla libreria standard, II. Manipolare input e output standard

Corso Programmazione

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Introduzione al linguaggio C Puntatori

Lezione IX Gestione dinamica della memoria

Introduzione al C Lez. 5. Stringhe

Librerie C. Corso di Linguaggi e Traduttori 1 AA

Gestione dei file in C

Gestione dei File. Credits Prof. Campi

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Esercizio 1: funzione con valore di ritorno di tipo puntatore

La funzione main() La funzione main(), presente in tutti i programmi C, è una funzione come tutte le altre

Lezione IX Gestione dinamica della memoria

I files in C. A cura del prof. Ghezzi

Corso di Informatica A.A

La programmazione nel linguaggio C

Il linguaggio C Puntatori

Sistemi Operativi (M. Cesati)

I files (archivi) Il C definisce in stdio.h tre file aperti automaticamente: stdin, stdout e stderr.! Sono ad accesso sequenziale diretto

Tipi di dato STRUTTURATI

Il linguaggio C. Notate che...

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Introduzione al C. Lezione 1 Elementi. Rossano Venturini. Pagina web del corso

Settimana n.12. Obiettivi File!di!testo. Contenuti Concetto!di!file!e!funzioni! fopen/fclose Funzioni!fgets+sscanf Approfondimenti!su!printf! e!

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

Argomenti. Array. Stringhe. Merge sort

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Sono variabili il cui valore corrisponde ad un indirizzo di memoria. Puntatori

Strutture dati. Operatori di incremento e decremento. Strutture di dati. Strutture di dati. ++ e -- Esempi. Vettori e matrici.

Lezione 11: Liste a Puntatori e Input/Output

Transcript:

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 interna è come un array di caratteri non modificabile terminato dal carattere '\0' c i c c i o \0 2

Le stringhe c i c c i o \0 Quindi una stringa occupa un array con un carattere in più riservato al carattere terminatore Le stringhe variabili sono rappresentate come array di caratteri: char parola[m], frase[n]; Per quanto detto prima bisogna sempre ricordarsi di allocare un carattere in più dei caratteri contenuti nelle stringhe che intendiamo scriverci dentro 3

Le stringhe Le costanti di tipo stringa sono di tipo puntatore a carattere: char * msg = "Errore di conversione"; E non sono modificabili, per dichiarare una stringa modificabile bisogna utilizzare un array di char char msg[n] = "Errore di conversione" oppure char msg[] = "Errore di conversione"; La stampa delle stringhe si può effettuare direttamente con il modificatore %s 4

Le stringhe Vediamo un esempio: int main (void) { char * msgconst = "Errore di conversione"; char msg[n] = "Errore di conversione"; printf( "%s, %s", msgconst, msg); /* stampa "Errore di conversione, Errore di conversione" su stdout */ msg[0]='z'; printf( "%s", msg); /* stampa "Zrrore di conversione" */... msgconst[0]='z'; /* da errore in esecuzione (Segmentation fault) */ 5

Le stringhe La libreria string.h contiene un insieme di funzioni predefinite per lavorare con le stringhe, ad esempio size_t strlen(char * s) fornisce la lunghezza della stringa senza il terminatore Ad esempio: int main (void) { char a[5]= ciao ; int i; i = strlen(a); /* i vale 4 */ /* notare che a e' lungo 5 */... } 6

Le stringhe Altre funzioni interessanti: char * strcpy(char* s,char* p) copia la stringa p nella stringa s e restituisce il puntatore s int strcmp(char* s,char* p) che confronta lessicograficamente p ed s (restituisce 0 se sono uguali, n<0 se s < p e n>0 altrimenti) char * strcat(char* s,char* p) che concatena p ed s (modifica s)e restituisce il puntatore s char * strstr(char* s, char* p) che cerca la prima occorrenza della stringa p in s e restituisce il puntatore a tale occorrenza se esiste NULL altrimenti 7

Le stringhe Vediamo alcuni esempi: int main (void) { char a[5]="ciao"; char b[20]="arrivederci"; int i; strcpy(b,a); printf( "%s\n", b); /* cosa stampa???? */... } 8

Le stringhe Vediamo alcuni esempi: int main (void) { char a[5]="ciao", c[10]; char b[20]="arrivederci"; int i; strcpy(c,a); strcat(b,":"); strcat(b,c); printf( "%s\n", b); /* cosa stampa? */ } 9

Le stringhe Vediamo alcuni esempi: int main (void) { char a[5]="ciao", char c[10]; char b[20]="arrivederci"; int i; if (strcmp(a,b)<0) printf( "%s", a); else printf( "%s", b); /* cosa stampa? */ } 10

Le stringhe Vediamo alcuni esempi: int main (void) { char a[5]="ciao", c[10]="ve"; char b[20]="arrivederci", *s; int i; s = strstr(a,c); printf( "%s\n", s); /* cosa stampa? */ s = strstr(b,c); printf( "%s\n", s); /* cosa stampa? */ } 11

Le stringhe Se non gestite bene le stringhe sono pericolose e generano errori difficili da rilevare e catastrofici Le funzioni di libreria si aspettano sempre di lavorare con stringhe correttamente terminate dal carattere nullo'\0', Es: implementazione di strcpy (da K&R) void strcpy (char*s, char*t){ } while ( ( *s++ = *t++ )!= '\0'); 12

Le stringhe void strcpy (char*s, char*t){ } while ( ( *s++ = *t++ )!= '\0'); Se la stringa non è terminata (o se s non ha abbastanza spazio) si continuano ad incrementare i puntatori andando avanti a leggere (e scrivere!) valori in memoria (buffer overrun) Si può sovrascrivere e danneggiare lo spazio di memoria di altre variabili, i frame sullo stack o la tabella di allocazione dello heap Si può raggiungere memoria non allocate o non accessibile ricevendo segnali di violazione di Segmento con conseguente terminazione del programma in esecuzione 13

Morale : Le stringhe Assicuratevi sempre che le stringhe siano terminate e che ci sia abbastanza spazio nei buffer Se non siete sicuri della presenza del terminatore usate funzioni che non permettano l overrun, perchè è possibile dire quanto è grande il buffer Es: strncpy(char* s,char*p, size_t n) in cui il terzo parametro serve per dire quanto è lungo il buffer s In questo caso dopo la copia bisogna controllare che il risultato contenga effettivamente il terminatore perchè la fine del buffer può essere stata raggiunta prima Usate strumenti come valgrind se avete dubbi sul comportamento del vostro programma (segnala scritture e letture fuori dai buffer sullo heap) 14

Sono pericolose: Leggere le stringhe scanf("...%s...", p) copia la stringa p nella stringa s ma meglio evitarla, può causare overrun su p char * gets(char * s ) Safe: da non usare mai perchè può causare overrun su s utilizzeremo fgets() (vedi libreria stdio.h) char * fgets(char* p, int sz, FILE* stream) legge dallo stream al più sz-1 caratteri fino al primo '\n' (compreso) ricopia tutto in p aggiungendo sempre il terminatore '\0' 15

Esempio: tutto maiuscolo Voglio leggere da stdin una serie di stringhe fino all'eof e stamparle trasformando tutti i caratteri in maiuscoli #include <stdio.h> #include <ctype.h> #include <string.h> #define N 256 int main (void) { int i, n; char * p; char buf[n+2]; p = fgets(buf, N+2, stdin); while (p!= NULL ) { n = strlen(buf); for( i=0; i< n-1; i++) buf[i]=toupper(buf[i]); printf( "%s", buf); p = fgets(buf, N+2, stdin); } return 0; } 16

Esempio: tutto maiuscolo $./maiuscolo Se digito "pippo" e ritorno carrello $./maiuscolo pippo PIPPO Se digito "ciccio" e ritorno carrello $./maiuscolo pippo PIPPO ciccio CICCIO 17

Esempio: tutto maiuscolo $./maiuscolo pippo PIPPO ciccio CICCIO $./maiuscolo pippo PIPPO ciccio CICCIO $ Esco con EOF (Control + D) 18

Conversioni stringa numero Per convertire una stringa in un tipo numerico sono disponibili diverse funzioni int sscanf ( const char * s, const char * format,...), int atoi(const char * str), long int atol ( const char * str ), double atof (const char* str); ASCII to integer, long or double Da usare quando siamo sicuri che la stringa e' ben formata e la base di conversione è 10 long int strtol (const char* str, char** endptr, int base), strtod() e varianti per convertire interi/reali quando è necessario gestire i possibili errori o scegliere una base diversa 19

Esempio: atoi Voglio leggere da standard input una serie di stringhe e convertirla in interi (base 10 con atoi()) #include <stdio.h> #include <stdlib.h> #define N 256 int main (void) { } int i; char * p; char buf[n+2]; p = fgets(buf, N+2, stdin); while (p!= NULL ) { i = atoi(buf); printf( "risultato = %d\n", i); p = fgets(buf, N+2, stdin); return 0; } 20

Esempio: atoi $./converti Se digito "56" e ritorno carrello $./converti 56 risultato = 56 Se digito "ciccio" e ritorno carrello $./converti 56 risultato = 56 ciccio risultato = 0 21

Esempio: strtol Voglio leggere da standard input una serie di stringhe convertirla in interi (base 16 con strtol()) #include <stdio.h> #include <stdlib.h> #define N 256 int main (void) { } int i; char * p; char buf[n+2]; p = fgets(buf, N+2, stdin); while (p!= NULL ) { i = strtol(buf,null,16); printf( "risultato = %d", i); p = fgets(buf, N+2, stdin); return 0; } 22

Esempio: strtol Voglio leggere da standard input una serie di stringhe convertirla in interi (base 16 con strtol()) controllando gli errori #include <stdio.h> #include <stdlib.h> #define N 256 int main (void) { int i; char * p, *q, buf[n+2]; p = fgets(buf, N+2, stdin); while ( p!= NULL ) { i = strtol(buf,&q,16); if ( *q!='\n' ) printf("errore!\n"); else printf( "risultato = %d\n", i); p = fgets(buf, N+2, stdin); } return 0; } 23

Esempio: strtol $./converti16 Se digito "a123" e ritorno carrello $./converti16 a123 risultato = 41251 Se digito "ciccio" e ritorno carrello $./converti16 a123 risultato = 41251 ciccio Errore!

Memcpy: copiare aree di memoria memcpy(void* s,const void*p, size_t n) Copia il contenuto della memoria a partire dall'indirizzo p per n byte (fino a p+n) nell'area che va da s a s+n 25

Memcpy: copiare aree di memoria memcpy(void* s,const void*p, size_t n) Es: p + 8 A018 p + 8 A018 10010011... 10010011... p A010 p A010 s + 8 10010011... A008 s A000 s A000

Memcpy: copiare aree di memoria memcpy(void* s,const void*p, size_t n) Copia il contenuto della memoria a partire dall'indirizzo p per n byte (fino a p+n) nell'area che va da s a s+n Es: assegnare un array ad un altro, abbiamo visto che l'assegnamento diretto non è possibile int a[n], b[n];... memcpy(b,a,n*sizeof(int)); /* copia tutto a in b */ 27