Presentazione di PowerPoint - uniroma1.itbloisi/didattica/...Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Parte 8 Stringhe Domenico

Post on 01-Apr-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

Transcript

Corso di Fondamenti di Informatica

Ingegneria delle Comunicazioni BCOR

Ingegneria Elettronica BELR

Parte 8

Stringhe

Domenico Daniele Bloisi

Si ringrazia Raffaele Nicolussi

2010/2011Stringhe

Parte 8

Pagina 2

Docenti

Parte I – prof. Silvio Salza

salza@dis.uniroma1.it

http://www.dis.uniroma1.it/~salza/fondamenti.htm

Parte II – ing. Domenico Daniele Bloisi

bloisi@dis.uniroma1.it

http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html

Nota: %7E corrisponde alla tilde ~

Pagina 3

Informazioni Generali

ing. Domenico Daniele Bloisi, PhD

Dipartimento di Informatica e Sistemistica

Via Ariosto 25

(adiacente Piazza Dante,

A fermate Manzoni, Vittorio Emanuele,

Tram 3 fermata via Labicana)

mailto:bloisi@dis.uniroma1.it

http://www.dis.uniroma1.it/~bloisi

2010/2011Stringhe

Parte 8

Ricevimento

Pagina 4

Martedì 15.00 – 17.00

DIS, via Ariosto 25

Aula docenti adiacente aula A4

Si consiglia di inviare una email per conferma e

di controllare la bacheca degli avvisi

http://www.dis.uniroma1.it/~bloisi/didattica/fondinf1011.html#Avvisi

2010/2011Stringhe

Parte 8

Pagina 52010/2011

Sommario – Parte 8

• Array di caratteri: stringhe

• Inizializzazione di stringhe

• Lettura e scrittura di stringhe

• Operazioni sulle stringhe

• Funzioni per la manipolazione delle

stringhe: strcpy, strncpy, strcat, strncat,

strcmp, strstr

• Input/Output in C

• Stream

• File

Stringhe

Parte 8

Pagina 62010/2011

Array di caratteri

Stringhe

Parte 8

Un caso particolare di array è quello

costituito da caratteri.

Infatti, le sequenze di caratteri servono per

gestire testi.

In C si usa il termine stringa per indicare gli

array di caratteri.

La libreria <string.h> offre alcune funzioni

speciali per gli array di caratteri.

Pagina 72010/2011

Rappresentazione di stringhe in C

Stringhe

Parte 8

Nel linguaggio C una stringa è rappresentata

mediante un array di caratteri terminante

con il carattere speciale '\0' (codice ASCII = 0),

che quindi funge da terminatore di stringa.

In questo modo è possibile conoscere la

lunghezza di una stringa contando il numero

di caratteri che precedono il carattere '\0'.

Pagina 82010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

s[5]='\0'; // terminatore stringa

printf("%s\n", s);

return 0;

} Nota: utilizzo del formato

%s nella printf per le

stringhe

Questo programma stampaHello

Pagina 92010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

int i;

for(i = 0; i < N; i++)

s[i] = 'a';

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

// mancato inserimento

// del terminatore stringa

printf("%s\n", s);

return 0;

}

Questo programma stampaHelloaaaaaaaaaaaaaaaaaaaa

Pagina 102010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

const int N = 25;

char s[N];

int i;

for(i = 0; i < N; i++)

s[i] = 'a';

s[0] = 'H'; s[1]='e'; s[2]='l';

s[3]='l'; s[4]='o';

s[5]='\0'; // terminatore stringa

printf("%s\n", s);

return 0;

}

Questo programma stampaHello

Pagina 112010/2011

Stringhe costanti

Stringhe

Parte 8

Pagina 122010/2011

Stringhe e caratteri

Stringhe

Parte 8

Pagina 132010/2011

Inizializzazione tramite stringa

costante

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

return 0;

}

Pagina 142010/2011Stringhe

Parte 8

Inizializzazione tramite stringa

costante

Pagina 152010/2011Stringhe

Parte 8

Inizializzazione tramite stringa

costante

warning: excess elements in

array initializer

Pagina 162010/2011

Esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

printf("dimensione di str = %d\n“,

sizeof(str));

char s[] = {'g', 'u', 'a', 'r', 'd', 'a'};

printf("%s\n", s);

printf("dimensione di s = %d\n", sizeof(s));

return 0;

}

Pagina 172010/2011

Possibile output

Stringhe

Parte 8

some text

dimensione di str = 20

guardasome text

dimensione di s = 6

Manca il carattere di

terminazione '\0'

dopo l’ultima 'a' di

“guarda”

Pagina 182010/2011

Modifica esempio

Stringhe

Parte 8

#include <stdio.h>

int main() {

char str[10] = "some text";

printf("%s\n", str);

printf("dimensione di str = %d\n“,

sizeof(str));

char s[] = {'g','u','a','r','d','a','\0'};

printf("%s\n", s);

printf("dimensione di s = %d\n", sizeof(s));

return 0;

}

carattere

speciale

'\0'

Pagina 192010/2011

Output

Stringhe

Parte 8

some text

dimensione di str = 20

guarda

dimensione di s = 7

Pagina 202010/2011

Stringhe e array

Stringhe

Parte 8

Pagina 212010/2011

Lettura e scrittura di stringhe

Stringhe

Parte 8

Pagina 222010/2011

Lettura e scrittura di stringhe

Stringhe

Parte 8

Pagina 232010/2011Stringhe

Parte 8

Lettura e scrittura di stringhe

Pagina 242010/2011

Stringhe e puntatori

Stringhe

Parte 8

Pagina 252010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

Per le stringhe rappresentate come array di

caratteri, bisogna distinguere tra

la dimensione dell’array (staticamente

determinato alla sua creazione)

la lunghezza della stringa, che può invece

variare a tempo di esecuzione.

Pagina 262010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

const int N = 256;

char s[N];

s[0]=’H’; s[1]=’e’; s[2]=’l’;

s[3]=’l’; s[4]=’o’;

s[5]=’\0’; // terminatore stringa

La dimensione dell’array è 256

La dimensione della stringa è 5

Pagina 272010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

La lunghezza (dimensione) della stringa deve

essere sempre minore o uguale della

dimensione dell’array meno uno (perché

bisogna considerare sempre il carattere

terminatore della stringa).

In caso contrario, si ha un accesso fuori dalla

zona di memoria allocata alla stringa con

conseguente possibilità di errori.

Pagina 282010/2011

Dimensione delle stringhe in C

Stringhe

Parte 8

Il calcolo della lunghezza di una stringa, cioè il

conteggio dei caratteri che precedono il

terminatore di stringa, si effettua tramite la funzione strlen (vedi dopo).

Tale funzione è però inefficiente (perché

richiede un ciclo di scansione di tutta la

stringa); quindi, a volte, si preferisce usare un

argomento esplicito che contiene la lunghezza

della stringa.

Pagina 292010/2011

Funzione strlen

Stringhe

Parte 8

size_t strlen( const char *str );

restituisce la lunghezza del parametro str.

E’ una funzione definita in <string.h>

Pagina 302010/2011Stringhe

Parte 8

Esempio strlen

#include <stdio.h>

#include <string.h>

int main() {

char str[100] = "test string";

printf("%d\n", sizeof(str));

printf("%d\n", strlen(str));

return 0;

}

Questo programma stampa

100

11

Pagina 312010/2011Stringhe

Parte 8

Una implementazione di strlen

size_t strlen(const char *str) {

const char* s = str;

for( ; *s; ++s);

return(s – str);

}

Verificare per esercizio

la correttezza di questa

implementazione

Pagina 322010/2011

Esempio: contare le occorrenze di una

lettera in una stringa

Stringhe

Parte 8

Scrivere una funzione che, presi come

parametri una stringa (sotto forma di array di caratteri) ed un carattere c, restituisca il

numero di occorrenze di c nella stringa.

Pagina 332010/2011

Esempio: contare le occorrenze di una

lettera in una stringa

Stringhe

Parte 8

int contaLettera (const char s[], int N, char c) {

int numlettera = 0;

int pos = 0;

while (pos < N) {

if (s[pos] == c)

numlettera++;

pos++;

}

return numlettera;

}

Pagina 342010/2011

Versione con strlen

Stringhe

Parte 8

int contaLettera (const char *s, char c) {

int numlettera = 0;

int pos = 0;

int N = strlen(s);

while (pos < N) {

if (s[pos] == c)

numlettera++;

pos++;

}

return numlettera;

}

Pagina 352010/2011

Main

Stringhe

Parte 8

int main() {

char s[256];

char c;

printf("digitare una parola, poi premere INVIO\n");

scanf("%s", s);

//pulisco il buffer in ingresso

while(c != '\n' && c!= EOF) {

c = getchar();

}

printf("digitare un carattere da cercare, poi premere

INVIO\n");

scanf("%c", &c);

int i = contaLettera(s, c);

printf("il carattere %c si trova %d volte in %s\n",

c, i, s);

return 0;

}

Pagina 362010/2011

Esempio: codifica di una stringa

Stringhe

Parte 8

Scrivere una funzione che, presi come parametri una stringa (sotto forma di array di caratteri) ed un intero d,

restituisca la stringa opportunamente codificata.

La codifica è ottenuta sostituendo ciascun carattere con

il carattere che ha codice pari al codice del carattere da sostituire incrementato di d.

Esempio"ciao" con d=3 diventerà "fldr"

Pagina 372010/2011

Esempio: codifica di una stringa

Stringhe

Parte 8

void codifica(const char *str, char *strRis, int d) {

char c;

int ci;

int N = strlen(str);

int i;

for (i = 0; i < N; i++)

strRis[i] = d + str[i];

strRis[N]=’\0’; // terminatore di stringa

return;

}

Pagina 382010/2011

Note

Stringhe

Parte 8

Nota 1: il primo dei due parametri di tipo array di caratteri ha il ruolo di input, ed è quindi dichiarato const, mentre il secondo ha il ruolo di

output e non può essere dichiarato const in quanto verrà modificato.

Nota 2: nell’istruzione strRis[i] = d + str[i]; c’è una

conversione implicita ad intero per poter effettuare la somma e poi una

conversione di nuovo a carattere per memorizzare il risultato.

Nota 3: in questa funzione si assume che sia stata già allocata memoria per la stringa di output strRis di dimensione almeno pari a

quella di str. Inoltre, è necessario aggiungere il carattere '\0' per

terminare la stringa di output.

Pagina 392010/2011

Esempio: lunghezza della più lunga

sottosequenza

Stringhe

Parte 8

Realizzare una funzione che prenda in ingresso una stringa s (sotto forma di array

di caratteri), che si può supporre essere

costituita dai soli caratteri '0' e '1', e

restituisca la lunghezza della più lunga sottosequenza di s costituita da soli '0' tutti

consecutivi.

Pagina 402010/2011

Esempio: lunghezza della più lunga

sottosequenza

Stringhe

Parte 8

Se la stringa passata come parametro è

"001000111100", allora la più lunga

sottosequenza di soli '0' è quella sottolineata,

che ha lunghezza 3.

Pagina 412010/2011

Sottosequenza

Stringhe

Parte 8

int sottosequenza(const char * s) {

char bit; // l’elemento corrente della sequenza

int cont = 0; // lunghezza attuale della sequenza di zeri

int maxlung = 0; // valore temporaneo della massima lunghezza

int N = strlen(s); // lunghezza della stringa

for (int i = 0; i < N; i++) {

bit = s[i];

if (bit == '0') { // e’ stato letto un altro '0'

cont++; // aggiorna la lunghezza della sequenza

// corrente

if (cont > maxlung) // se necessario, aggiorna

// il massimo temporaneo

maxlung = cont;

} else // e’ stato letto un '1'

cont = 0; // azzera la lunghezza della sequenza

//corrente

}

return maxlung;

}

Pagina 422010/2011

Esercizio

Stringhe

Parte 8

Esercizio 8.1

Scrivere un programma che utilizzi la funzione sottosequenza con input

01000100001110

stampando a video il risultato ottenuto

Pagina 432010/2011

Esercizi

Stringhe

Parte 8

Esercizio 8.2

Scrivere una funzione che, data una stringa, ne

restituisca l’ultimo carattere.

Pagina 442010/2011

Esercizi

Stringhe

Parte 8

Esercizio 8.3

Scrivere un programma che legga da input una linea contenente una

domanda a risposta SI/NO senza simboli di punteggiatura, e stampi

una risposta alla domanda in base alle seguenti regole:

1. se la frase inizia e finisce con una vocale la risposta è "FORSE"

2. se l’ultima lettera della frase è "a", "i", oppure "u", la risposta è "SI“

3. se l’ultima lettera della frase è "e" oppure "o", la risposta è "NO“

4. se l’ultima lettera della frase è un carattere diverso da "a", "e", "i",

"o", "u" , la risposta è "NON SO"

Nota: quando si applicano due regole, la risposta si ottiene facendo la

concatenazione delle risposte.

top related