Stringhe e allocazione dinamica della memoria
|
|
|
- Clemente Venturini
- 9 anni fa
- Просмотров:
Транскрипт
1 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 linea, in ordine inverso rispetto all ordine di lettura. Si assume che: la lunghezza massima di una parola è definita nel programma dalla macro MAX LEN (ad esempio, si può porre MAX LEN uguale a 30); il numero massimo di parole in input è definito dalla macro MAX WORDS (ad esempio, si può porre MAX WORDS uguale a 100). Esempio Supponiamo che lo standard input sia cane ape cavallo Deve essere stampato cavallo ape cane
2 Lettura di stringhe con scanf Per leggere una stringa da standard input si può fare la chiamata scanf("%s", w) dove w è l indirizzo di un array di char contenere la parola lette in input. sufficientemente grande per Poiché stiamo assumendo che le parole in input abbiano al massimo MAX LEN caratteri, si può porre: char w[max_len + 1]; // array di MAX_LEN+1 elementi
3 Lettura di stringhe con scanf In C le stringhe devono terminare con il carattere \0 (carettere nullo il cui codice ASCII è 0). Quindi, se occorre memorizzare una parola di n caratteri in una array di char w, il numero di elementi di w deve essere maggiore o uguale a n + 1. Quando si legge una stringa da standard input usando scanf con specifica di formato %s, i blank (caratteri di spaziatura) che precedono la stringa sono saltati; la lettura della stringa termina quando viene letto un blank. Se viene letto end-of-file, scanf restituisce EOF.
4 Array di stringhe Poiché le parole lette in input vanno stampate in ordine inverso, devono essere memorizzate. Dato che sappiamo che il numero massimo di parole è MAX WORDS, si può definire un array char* words[max_words]; // array di stringhe Per ogni k tale che 0 k MAX WORDS words[k] deve puntare all array che contiene la k-esima stringa letta.
5 Array di stringhe Quando la k-esima parola (k 0) è stata letta, occorre eseguire le seguenti operazioni: 1. Allocare dinamicamente un array di char in cui sia possibile memorizzare w; 2. Assegnare a words[k] l indirizzo del nuovo array; 3. Copiare w nel nuovo array.
6 Array di stringhe Quindi, dopo la letture delle parole cane, ape e cavallo, l array words può essere rappresentato come: words[0] words[1] words[2]... c a n e \0 a p e \0 c a v a l l o \0
7 Array di stringhe Per stampare le parole in ordine inverso, occorre stampare l array words partendo dall ultima posizione occupata da una parola. Quindi, se l ultima parola è word[k-1] si può eseguire il ciclo: // stampa in ordine inverso for( i = k-1 ; i >= 0 ; i-- ) printf("%s\n",words[i]); // stampa stringa words[i]
8 Funzioni ausiliarie Occorre definire le seguenti due funzioni: int length(char* w) Restituisce la lunghezza della stringa w, ossia il numero di caratteri presenti in w (senza contare il carattere di fine stringa \0 ). Ad esempio, se w è la stringa "cane", la funzione deve restituire 4. void copy(char* to, char* from) Copia la stringa from nell array to. Si assume che to sia sufficientemente grande per poter contenere la stringa from. Ad esempio, se from è la stringa "cane", l array to deve contenere almeno 5 elementi, in quanto per rappresentare "cane" occorrono 5 caratteri (un carattere per ogni lettera più il carattere di fine stringa).
9 Le funzioni length e copy /* Restituisce la lunghezza della stringa w */ int length(char* w){ int k; for ( k=0 ; w[k]!= \0 ; k++); // il ciclo termina quando w[k] = \0 return k; } /* Copia la stringa from nell array to. Si assume che to sia sufficientemente grande per contenere from. */ void copy(char* to, char* from){ int k; for(k=0 ; from[k]!= \0 ; k++) // il ciclo termina quando from[k]= \0 to[k] = from[k]; to[k] = \0 ; // carattere fine stringa }
10 Allocazione dinamica della memoria Per allocare dinamicamente un array si può usare la funzione calloc (occorre includere lo header file <stdlib.h>). Per creare un nuovo array di char in grado di contenere una stringa di lunghezza len, la chiamata da fare è calloc(len+1, sizeof(char)) Viene restuito l indirizzo del nuovo array, che andrà assegnato a un elemento words[k] dell array words.
11 La funzione main int main(void){ char w[max_len+1]; // array usato per la lettura di una parola char* words[max_words]; // array che contiene tutte le parole lette int k, read, len,i; k = 0; read = scanf("%s", w); // leggi prima parola while(read!= EOF){ len = length(w); words[k] = calloc(len+1, sizeof(char)); copy( words[k], w); k++; read = scanf("%s", w); // leggi prossima parola } // l ultima parola letta e words[k-1] // stampa in ordine inverso le parole lette for( i=k-1 ; i >= 0 ; i--) printf("%s\n",words[i]); // stampa stringa words[i] return 0; }
12 Le funzioni strlen e strcpy La libreria C mette a disposizione numerose funzioni per eseguire operazioni su stringhe (occorre includere lo header file <string.h>). Ad esempio: Per calcolare la lunghezza di una stringa si può usare la funzione strlen Per copiare una stringa in una array si può usare la funzione strcpy. Possiamo usare strlen e strcpy invece di length e copy. Si raccomanda di leggere la documentazione sul libro o su un manuale. Va letto con attenzione cosa fa una funzione e le assunzioni sui parametri.
13 Le funzioni strlen e strcpy L istruzione len = length(w); può essere sostituita dall istruzione len = strlen(w); L istruzione copy(words[k],w); può essere sostituita da strcpy(words[k],w);
14 Esempio di esecuzione Supponiamo che la prima parola sullo standard input sia cane L istruzione read = scanf("%s", w); legge la stringa (saltando gli spazi iniziali) e la memorizza nell array w (vengono utilizzati solo i primi 5 elementi di w). Poiché il valore restituito di read è diverso da EOF, vengono eseguite le istruzioni nel ciclo.
15 Esempio di esecuzione La memoria può essere schematicamente rappresentata in questo modo: main w[0] c w[1] a w[2] n w[3] e w[4] \0... words[0] words[1] words[2]...
16 Esempio di esecuzione Dopo l istruzione len = length(w); la variabile len vale 4. La chiamata words[k] = calloc(len+1, sizeof(char)); // k vale 0 crea un nuovo array di char di 5 elementi e assegna il suo indirizzo a words[0]. Quindi, words[0] punta al nuovo array (è l unico modo in cui è possibile accedere ad esso).
17 Esempio di esecuzione main w[0] c w[1] a w[2] n w[3] e w[4] \0... words[0] words[1] words[2]...
18 Esempio di esecuzione La chiamata copy( words[k], w); // k vale 0 copia la stringa w, ossia la stringa "cane", nel nuovo array. La chiamata si può scrivere anche come: copy( words[k], &w[0] ); Il primo argomento passato a copy è il valore di words[0], che è l indirizzo dell array creato dinamicamente. Il secondo argomento passato a copy è l indirizzo del primo elemento dell array w (elemento contenente il primo carattere della stringa da copiare).
19 Esempio di esecuzione Dopo il passaggio dei parametri si ha: copy main from to k w[0] c w[1] a w[2] n w[3] e w[4] \0... words[0] words[1] words[2]...
20 Esempio di esecuzione from[0] è sinonimo di w[0] (from[0] e w[0] denotano la stessa locazione di memoria); from[1] è sinonimo di w[1]... to[0] denota il primo elemento del nuovo array; to[1] denota il secondo elemento del nuovo array;... Il ciclo in copy esegue gli assegnamenti: to[0] = w[0] to[1] = w[1] to[2] = w[2] to[3] = w[3] // c // a // n // e Quando k vale 4, il ciclo termina. La prossima istruzione pone to[4] = \0
21 Esempio di esecuzione copy from to k 4 main w[0] c w[1] a w[2] n w[3] e w[4] \0... words[0] words[1] words[2]... c a n e \0
22 Esempio di esecuzione Supponiamo che la prossima parola sia "ape". Viene creato dinamicamente un nuovo array di 4 elementi e assegnato a words[1]; nel nuovo array viene copiata la stringa "ape". Dopo tali istruzioni, l array words è: words[0] words[1] words[2]... c a n e \0 a p e \0 Completare l esecuzione passo-passo dell esempio.
23 Esercizio 2 Consideriamo il seguente programma: #include <stdio.h> #include <string.h> int main(void){ char w[6]; w[0] = c ; w[1] = a ; w[2] = m ; w[3] = p ; w[4] = o ; w[5] = \0 ; printf("(1) %s--->len = %d\n", w, strlen(w)); printf("(2) %s--->len = %d\n", w+3, strlen(w+3)); w[2] = \0 ; printf("(3) %s--->len = %d\n", w, strlen(w)); printf("(4) %s--->len = %d\n", w+1, strlen(w+1)); printf("(5) %s--->len = %d\n", w+2, strlen(w+2)); printf("(6) %s--->len = %d\n", w+3, strlen(w+3)); return 0; }
24 Esercizio 2 1 Eseguire il programma e motivare l output ottenuto 2 Sostituire la definizione char w[6]; con char w[5]; Cosa succede eseguendo il programma? Perché?
Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))
Allocazione dinamica della memoria: malloc() In C è possibile allocare dinamicamente un area di memoria (ossia, durante l esecuzione di un programma) tramite le funzioni malloc() e calloc() (occorre includere
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
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
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
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
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
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
Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi
Informatica 1 Corso di Laurea Triennale in Matematica Gianluca Rossi [email protected] Dipartimento di Matematica Università di Roma Tor Vergata 11: Stringhe (www.informatica-uno.blogspot.com)
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
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
Lezione 19 e Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe
Lezione 19 e 20 - Allocazione dinamica della memoria - Direttive al preprocessore - Libreria standard - Gestione delle stringhe Valentina Ciriani (2005-2008) Laboratorio di programmazione Valentina Ciriani
Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata
Puntatori int i = 10; int * pi = &i; pi i = 10 116 int * pi = pi contiene un informazione che mi permette di accedere ( puntare ) ad una variabile intera Un puntatore contiene un numero che indica la locazione
9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
9 - Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea
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
Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.
Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;
ESERCIZIO 1 ESERCIZIO 2
ESERCIZIO 1 Scrivere una funzione che data una stringa A calcoli la sua lunghezza. int lunghezza(char A[]); Scrivere una funzione che date due stringhe A e B copi il contenuto di A in B e restituisca il
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;
Esercitazione 11. Liste semplici
Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene
Esercitazione 6. Array
Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione
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ù
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
ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
Variabili e Istruzioni
Exit Menù Variabili e Istruzioni 1 Le Variabili Una VARIABILE è un oggetto identificato da un NOME e da uno STATO, detto CONTENUTO o VALORE. Possiamo immaginarla come una scatola contenuto Pippo 11 nome
Stringhe e tipi di dati strutturati
Stringhe e tipi di dati strutturati Marco D. Santambrogio [email protected] Ver. aggiornata al 21 Marzo 2013 Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore!
Aritmetica dei puntatori
Aritmetica dei puntatori Marco Alberti Programmazione e Laboratorio, A.A. 2016-2017 Dipartimento di Matematica e Informatica - Università di Ferrara Ultima modifica: 7 dicembre 2016 sizeof L operatore
#include <stdio.h> main() { - 1 -
Un primo esempio di programma Ogni programma C deve contenere una funzione speciale chiamata main che indica il punto in cui inizia l esecuzione del programma. La funzione main è unica all interno di ogni
Puntatori (in C) Emilio Di Giacomo
Puntatori (in C) Emilio Di Giacomo Puntatori In questa lezione parleremo di uno dei costrutti più potenti del C: i puntatori I puntatori vengono utilizzati per realizzare il passaggio di parametri per
