Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS,...

87
Laboratorio di Informatica Linguaggio C (Stringhe e Caratteri) Corso di Laurea in Informatica e Tecnologie per la Produzione del Software (Track B) - A.A. 2018/2019 docente: Cataldo Musto [email protected]

Transcript of Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS,...

Page 1: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Laboratorio di InformaticaLinguaggio C

(Stringhe e Caratteri)

Corso di Laurea in Informatica e Tecnologie per la Produzione del Software (Track B) - A.A. 2018/2019

docente: Cataldo Musto

[email protected]

Page 2: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 2Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 3: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

• «Stringa» è il nome che identifica un insieme di caratteri chiusi tra virgolette• char string1[] = "first";• Equivalente a un array di caratteri

• char string1[] = {'f','i','r','s','t','\0'};• Ha sei elementi (Stringhe di N caratteri hanno N+1 elementi), memorizzati in

locazioni contigue

• Il carattere '\0' termina le stringhe ed è detto terminatore.• Nell’inizializzione delle stringhe è inserito in automatico, altrimenti deve essere

inserito esplicitamente

14/03/2019 3Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 4: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

• «Stringa» è il nome che identifica un insieme di caratteri chiusi tra virgolette• char string1[] = "first";• Equivalente a un array di caratteri

• char string1[] = {'f','i','r','s','t','\0'};• Ha sei elementi (Stringhe di N caratteri hanno N+1 elementi), memorizzati in

locazioni contigue

• Il carattere '\0' termina le stringhe ed è detto terminatore.• Nell’inizializzione delle stringhe è inserito in automatico, altrimenti deve essere

inserito esplicitamente

14/03/2019 4Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 5: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe• Trattandosi di array, è possibile accedere ai caratteri

individualistring1[3] è il carattere ‘s’

•Nel caso degli array di stringhe, & non è richiestonella scanf• scanf( "%s", string2 );• Perchè? Il nome dell’array è un puntatore all’indirizzo del primo

elemento

14/03/2019 5Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 6: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe• Trattandosi di array, è possibile accedere ai caratteri

individualistring1[3] è il carattere ‘s’

•Nel caso degli array di stringhe, & non è richiestonella scanf• scanf( "%s", string2 );• Perchè?

• Il nome dell’array è un puntatore all’indirizzo del primo elemento

14/03/2019 6Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 7: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

14/03/2019 7

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 8: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

14/03/2019 8

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Dichiaro una stringa di dimensione 10

Page 9: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

14/03/2019 9

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Leggo l’inputImportante: %s non %c

Page 10: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

14/03/2019 10

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

DomandaCosa stampa se

inserisco una stringa la cui dimensione è maggiore a 10?

Page 11: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

14/03/2019 11

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

DomandaCosa stampa se

inserisco una stringa la cui dimensione è maggiore a 10?

Page 12: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe - Esempio

• Il Linguaggio C non effettua nessun controllo sulla lunghezza delle stringhe• Il realtà non effettua nessun controllo sugli array!

• Stringhe anche più lunghe di LENGTH saranno correttamente memorizzate

• Non abbiamo però la garanzia che il programma funzioni correttamente• Possibili comportamenti inattesi! Può causare un buffer overflow e un crash

del programma

• Accorgimento: limitare il numero di caratteri letti in input, sempre!

14/03/2019 Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

12

Page 13: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 13

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 14: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 14

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Limito la lettura ai primi N-1 caratteri (l’ultimo è il

terminatore)

Page 15: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 15

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Limito la lettura ai primi N-1 caratteri (l’ultimo è il

terminatore)

Page 16: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 16

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Importante: la scanf( ) si ferma se trova un

terminatore o uno spazio

Page 17: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 17

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Importante: la scanf( ) si ferma se trova un

terminatore o uno spazio

Page 18: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Funzioni di Elaborazione

14/03/2019 18Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

• C include numerose funzioni per l’elaborazione di stringhe e caratteri• Disponibili nella libreria <ctype.h>

• Funzioni per l’elaborazione dei caratteri• Controllo che un dato carattere sia un numero o una lettera

• Controllo che un dato carattere sia maiuscolo o minuscolo

• Controllo che un dato carattere sia un simbolo di punteggiatura, uno spazio, etc.

• Funzioni per l’elaborazione delle stringhe• Confronto tra due stringhe (verifica se sono uguali o meno)

• Conversione stringhe → valori numerici (e viceversa)

• Copia (parziale o totale) di una stringa in un’altra stringa o concatenazione tra stringhe

• Suddivisione di una frase in singoli termini (tokenizzazione)

Page 19: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Funzioni di Elaborazione

14/03/2019 19Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

• C include numerose funzioni per l’elaborazione di stringhe e caratteri• Disponibili nella libreria <ctype.h>

• Funzioni per l’elaborazione dei caratteri• Controllo che un dato carattere sia un numero o una lettera

• Controllo che un dato carattere sia maiuscolo o minuscolo

• Controllo che un dato carattere sia un simbolo di punteggiatura, uno spazio, etc.

• Funzioni per l’elaborazione delle stringhe• Confronto tra due stringhe (verifica se sono uguali o meno)

• Conversione stringhe → valori numerici (e viceversa)

• Copia (parziale o totale) di una stringa in un’altra stringa o concatenazione tra stringhe

• Suddivisione di una frase in singoli termini (tokenizzazione)

Page 20: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 20Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

int isdigit( int c ); Restituisce vero se il carattere è una cifra

int isalpha( int c ); Restituisce vero se il carattere è alfabetico

int isalnum( int c ); Restituisce vero se il carattere è alfanumerico

int isxdigit( int c ); Restituisce vero se il carattere è esadecimale

int islower( int c ); Restituisce vero se il carattere è minuscolo

int isupper( int c ); Restituisce vero se il carattere è maiuscolo

int tolower( int c ); Trasforma c in carattere minuscolo (se è maiuscolo) o lo lascia uguale

In C i valori booleani sono codificati come interi:True = 1 False = 0

Page 21: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 21Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

int toupper( int c ); Trasforma c in carattere maiuscolo (se è minuscolo) o lo lascia uguale

int isspace( int c ); Restituisce vero se c è uno spazio, un newline ('\n'), form feed ('\f’), ritorno carrello ('\r’), spaziatura orizzontale ('\t'), o spaziatura verticale ('\v’)

int iscntrl( int c ); Restituisce vero se c è un carattere di controllo

int ispunct( int c ); Restituisce vero se c è un carattere diverso da spazio, cifra o lettera

int isprint( int c ); Restituisce vero se c è un carattere di stampa (incluso lo spazio)

int isgraph( int c ); Restituisce vero se c è un carattere di stampa (escluso lo spazio)

In C i valori booleani sono codificati come interi:True = 1 False = 0

Page 22: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 22Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isdigit(char) restituisce a 1 se il carattere è un numero, altrimenti sarà uguale a 0

Page 23: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 23Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isdigit(char) restituisce a 1 se il carattere è un numero, altrimenti sarà uguale a 0

Page 24: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 24Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isalpha(char) restituisce a 1 se il carattere è alfabetico, altrimenti sarà uguale a 0

is not alphabetic’’, a);

is not alphabetic’’, a);

is alphabetic’’, a);

is alphabetic’’, a);

a.a. 2018/2019

Page 25: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 25Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isalpha(char) restituisce a 1 se il carattere è alfabetico, altrimenti sarà uguale a 0

is not alphabetic’’, a);

is not alphabetic’’, a);

is alphabetic’’, a);

is alphabetic’’, a);

a.a. 2018/2019

Page 26: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 26Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isalnum(char) restituisce a 1 se il carattere è alfanumerico, altrimenti sarà uguale a 0

a.a. 2018/2019

Page 27: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 27Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

isalnum(char) restituisce a 1 se il carattere è alfanumerico, altrimenti sarà uguale a 0.

a.a. 2018/2019

Page 28: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 28Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

islower(char) restituisce a 1 se il carattere è minuscolo, altrimenti sarà uguale a 0.

isupper(char) restituisce a 1 se il carattere è maiuscolo, altrimenti sarà uguale a 0.

a.a. 2018/2019

Page 29: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 29Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

islower(char) restituisce a 1 se il carattere è minuscolo, altrimenti sarà uguale a 0.

isupper(char) restituisce a 1 se il carattere è maiuscolo, altrimenti sarà uguale a 0.

a.a. 2018/2019

Page 30: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per l’elaborazione dei caratteri

14/03/2019 30Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

toupper(char) converte un carattere in maiuscolo.

a.a. 2018/2019

Page 31: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Recap

14/03/2019 31Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

int isdigit( int c ); Restituisce vero se il carattere è una cifra

int isalpha( int c ); Restituisce vero se il carattere è alfabetico

int isalnum( int c ); Restituisce vero se il carattere è alfanumerico

int isxdigit( int c ); Restituisce vero se il carattere è esadecimale

int islower( int c ); Restituisce vero se il carattere è minuscolo

int isupper( int c ); Restituisce vero se il carattere è maiuscolo

int tolower( int c ); Trasforma c in carattere minuscolo (se è maiuscolo) o lo lascia uguale

In C i valori booleani sono codificati come interi:True = 1 False = 0

Page 32: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Recap (cont.)

14/03/2019 32Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

int toupper( int c ); Trasforma c in carattere maiuscolo (se è minuscolo) o lo lascia uguale

int isspace( int c ); Restituisce vero se c è uno spazio, un newline ('\n'), form feed ('\f’), ritorno carrello ('\r’), spaziatura orizzontale ('\t'), o spaziatura verticale ('\v’)

int iscntrl( int c ); Restituisce vero se c è un carattere di controllo

int ispunct( int c ); Restituisce vero se c è un carattere diverso da spazio, cifra o lettera

int isprint( int c ); Restituisce vero se c è un carattere di stampa (incluso lo spazio)

int isgraph( int c ); Restituisce vero se c è un carattere di stampa (escluso lo spazio)

In C i valori booleani sono codificati come interi:True = 1 False = 0

Page 33: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 33

Problema 3.1Scrivere un programma che acquisisca in input la password inserita da un utente.

Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Input?

Output?

Quale tipologia di istruzioni ci serve?

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 34: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 34

Problema 3.1

Input?

Output?

Quale tipologia di istruzioni ci serve?

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 35: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 35

Problema 3.1

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Input? Stringa, inserita dall’utenteOutput?Messaggio di conferma o messaggio di erroreQuale tipologia di istruzioni ci serve?- Istruzioni per la manipolazione dei caratteri- (che altro?)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 36: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 36

Problema 3.1

Input? Stringa, inserita dall’utente.Output?Messaggio di conferma o messaggio di errore.Quale tipologia di istruzioni ci serve?- Istruzioni per la manipolazione dei caratteri- Istruzioni di iterazione

- Suggerimento: una stringa è un array di caratteri

EsempioInput: cat4ldo Output: «Password non corretta, inserire almeno una lettera maiuscola»

Input: PasswordOutput: «Password non corretta, inserire almeno un numero»

Input: Pa55wordOutput: «Password impostata correttamente.»

Scrivere un programma che acquisisca in input la password inserita da un utente. Verificare che la password contenga almeno una lettera maiuscola ed almeno un numero.

Stampare in input un messaggio di conferma se la password è corretta. In alternativa, stampare un messaggio di errore.

Codificare la soluzione su Repl.it

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 37: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 37

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 9 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Page 38: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 38

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 9 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 7 – dichiaro una variabile per uscire dal ciclo

Page 39: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 39

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 9 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 7 – dichiaro una variabile per uscire dal ciclo

Rigo 14 – il programma viene eseguito finché la variabile sentinella è uguale a zero

Page 40: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 40

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 9 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 7 – dichiaro una variabile per uscire dal ciclo

Rigo 14 – il programma viene eseguito finché la variabile sentinella è uguale a zero

Rigo 19-20 – perché inizializzo nuovamente queste variabili?

Page 41: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 41

Soluzione 3.1 (parte 2)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

21 // ELABORAZIONE INPUT22 for ( unsigned i=0; i<PASSWORD_LENGTH ; i++) {23 digit += isdigit(password[i]);24 upper += isupper(password[i]);2526 if ((digit > 0) && (upper > 0))27 i = PASSWORD_LENGTH; // a che serve? 28 }2930 // VISUALIZZAZIONE OUTPUT31 if ( (digit>0) && (upper>0) ) {32 puts("Password impostata correttamente");33 correct++;34 }35 else if ( digit == 0) 36 puts("Inserire almeno un carattere numerico");37 if (upper == 0) 38 puts("Inserire almeno un carattere maiuscolo");39 }}

Page 42: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 42

Soluzione 3.1 (parte 2)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

21 // ELABORAZIONE INPUT22 for ( unsigned i=0; i<PASSWORD_LENGTH ; i++) {23 digit += isdigit(password[i]);24 upper += isupper(password[i]);2526 if ((digit > 0) && (upper > 0))27 i = PASSWORD_LENGTH; // a che serve? 28 }2930 // VISUALIZZAZIONE OUTPUT31 if ( (digit>0) && (upper>0) ) {32 puts("Password impostata correttamente");33 correct++;34 }35 else if ( digit == 0) 36 puts("Inserire almeno un carattere numerico");37 if (upper == 0) 38 puts("Inserire almeno un carattere maiuscolo");39 }}

Riga 22-28scorro tutti i caratteri della password, conteggiando il numero di caratteri maiuscoli e di cifre numeriche

Ogni qual volta dovete scrivere del codice che verifichi che una stringa verifichi/non verifichi determinati criteri avete bisogno di un ciclo!

Perché la stringa è un array, e gli array si elaborano coi cicli!

Page 43: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 43

Soluzione 3.1 (parte 2)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

21 // ELABORAZIONE INPUT22 for ( unsigned i=0; i<PASSWORD_LENGTH ; i++) {23 digit += isdigit(password[i]);24 upper += isupper(password[i]);2526 if ((digit > 0) && (upper > 0))27 i = PASSWORD_LENGTH; // a che serve? 28 }2930 // VISUALIZZAZIONE OUTPUT31 if ( (digit>0) && (upper>0) ) {32 puts("Password impostata correttamente");33 correct++;34 }35 else if ( digit == 0) 36 puts("Inserire almeno un carattere numerico");37 if (upper == 0) 38 puts("Inserire almeno un carattere maiuscolo");39 }}

Riga 22-28scorro tutti i caratteri della password, conteggiando il numero di caratteri maiuscoli e di cifre numeriche

Riga 26-27Non ho bisogno di eseguire tutti i cicli! E’ sufficiente farlo finché si trova un carattere e una maiuscola. In questo modo si riducono gli accessi in memoria e il programma è più efficiente.

Page 44: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 44

Soluzione 3.1 (parte 2)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

21 // ELABORAZIONE INPUT22 for ( unsigned i=0; i<PASSWORD_LENGTH ; i++) {23 digit += isdigit(password[i]);24 upper += isupper(password[i]);2526 if ((digit > 0) && (upper > 0))27 i = PASSWORD_LENGTH; // a che serve? 28 }2930 // VISUALIZZAZIONE OUTPUT31 if ( (digit>0) && (upper>0) ) {32 puts("Password impostata correttamente");33 correct++;34 }35 else if ( digit == 0) 36 puts("Inserire almeno un carattere numerico");37 if (upper == 0) 38 puts("Inserire almeno un carattere maiuscolo");39 }}

Riga 30-38Stampa dell’output.

Stampa un messaggio di avvenuta impostazione se l'utente ha inserito almeno un numero e almeno una maiuscola, altrimenti stampa un messaggio di errore.

Page 45: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 45

Soluzione 3.1 (parte 2)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

21 // ELABORAZIONE INPUT22 for ( unsigned i=0; i<PASSWORD_LENGTH ; i++) {23 digit += isdigit(password[i]);24 upper += isupper(password[i]);2526 if ((digit > 0) && (upper > 0))27 i = PASSWORD_LENGTH; // a che serve? 28 }2930 // VISUALIZZAZIONE OUTPUT31 if ( (digit>0) && (upper>0) ) {32 puts("Password impostata correttamente");33 correct++;34 }35 else if ( digit == 0) 36 puts("Inserire almeno un carattere numerico");37 if (upper == 0) 38 puts("Inserire almeno un carattere maiuscolo");39 }}

Riga 30-38Stampa dell’output.

Stampa un messaggio di avvenuta impostazione se l'utente ha inserito almeno un numero e almeno una maiuscola, altrimenti stampa un messaggio di errore.

Torniamo alla domanda precedente.

Page 46: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 46

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 10 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 7 – dichiaro una variabile per uscire dal ciclo

Rigo 14 – il programma viene eseguito finché la variabile sentinella è uguale a zero

Rigo 19-20 – perché inizializzo nuovamente queste variabili?

Page 47: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 47

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 10 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 19-20 – perché inizializzo nuovamente queste variabili?

Commentare le righe 19 e 20 ed eseguire il programma inserendo queste password:• password• passw0rd• Password

La terza password viene accettata, nonostante non sia corretta

Page 48: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 48

Soluzione 3.1 (parte 1)

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 #include <stdio.h>2 #include <ctype.h> // includo la libreria per gestire le 3 funzioni sui caratteri4 #define PASSWORD_LENGTH 10 // lunghezza massima della password56 int main() {7 int correct = 0; // variabile di controllo, diventa = 1 quando8 è stata inserita una password corretta9 char password[PASSWORD_LENGTH]; // vettore contenente la password1011 int upper = 0; // variabili di controllo del numero di maiuscole12 int digit = 0; // e del numero di cifre numeriche1314 while ( correct == 0 ) {15 //INSERIMENTO INPUT16 printf("Inserisci la tua password (max. 10 caratteri): ");17 scanf("%9s", &password); // leggo esattamente nove caratteri1819 upper = 0; // NOTA: perchè inizializzo queste variabili a zero?20 digit = 0;

Rigo 19-20 – perché inizializzo nuovamente queste variabili?

Commentare le righe 19 e 20 ed eseguire il programma inserendo queste password:• password• passw0rd• Password

La terza password viene accettata, nonostante non sia corretta

Se non inizializzassimo le variabili ad ogni ciclo, rimarrebbero memorizzati i valori dei cicli precedenti, e password non corrette potrebbero essere accettate

Page 49: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Funzioni di Elaborazione

14/03/2019 49Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

• Confrontare le stringhe• Il computer confronta i codici numerici ASCII dei caratteri delle stringhe

int strcmp( const char *s1, const char *s2 );

• Confronta la stringa s1 con s2• Restituisce zero se sono uguali, un numero negativo se s1 < s2, o un numero positivo

se s1 > s2 (es. Roma > Bari, Albero < Bari)

int strncmp( const char *s1, const char *s2, size_t n );

• Confronta N caratteri della stringa s1 con s2• Restituisce gli stessi valori come sopra

• Restituisce zero se I primi N caratteri sono uguali.

Page 50: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Funzioni di Elaborazione

14/03/2019 50Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

• Confrontare le stringhe• Il computer confronta i codici numerici ASCII dei caratteri delle stringhe

int strcmp( const char *s1, const char *s2 );

• Confronta la stringa s1 con s2• Restituisce zero se sono uguali, un numero negativo se s1 < s2, o un numero positivo

se s1 > s2 (es. Roma > Bari, Albero < Bari)

int strncmp( const char *s1, const char *s2, size_t n );

• Confronta N caratteri della stringa s1 con s2• Restituisce gli stessi valori come sopra

• Restituisce zero se i primi N caratteri sono uguali.

Page 51: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Confronto tra Stringhe

14/03/2019 51Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(void) {

char string1[] = "test-ok";

char string2[] = "test-ok";

char string3[] = "test-non-ok";

if(!strcmp(string1,string2))

puts("Le stringhe 1 e 2 sono uguali");

if(!strcmp(string1,string3))

puts("Le stringhe 1 e 3 sono uguali");

if(!strncmp(string1,string3,5))

puts("Le stringhe 1 e 3 sono uguali nei primi 5 caratteri");

return EXIT_SUCCESS;

}

Perché si usa il «!» (not) ?

Page 52: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Confronto tra Stringhe

14/03/2019 52Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(void) {

char string1[] = "test-ok";

char string2[] = "test-ok";

char string3[] = "test-non-ok";

if(!strcmp(string1,string2))

puts("Le stringhe 1 e 2 sono uguali");

if(!strcmp(string1,string3))

puts("Le stringhe 1 e 3 sono uguali");

if(!strncmp(string1,string3,5))

puts("Le stringhe 1 e 3 sono uguali nei primi 5 caratteri");

return EXIT_SUCCESS;

}

Perché si usa il «!» (not) ?

Perché strcmp restituisce 0 se le due stringhe sono uguali e lo 0 viene identificato in C come «negazione», quindi bisogna utilizzare l’operatore di negazione «!»

Page 53: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Confronto tra Stringhe

14/03/2019 53Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int main(void) {

char string1[] = "test-ok";

char string2[] = "test-ok";

char string3[] = "test-non-ok";

if(!strcmp(string1,string2))

puts("Le stringhe 1 e 2 sono uguali");

if(!strcmp(string1,string3))

puts("Le stringhe 1 e 3 sono uguali");

if(!strncmp(string1,string3,5))

puts("Le stringhe 1 e 3 sono uguali nei primi 5 caratteri");

return EXIT_SUCCESS;

}

Perché si usa il «!» (not) ?

Perché strcmp restituisce 0 se le due stringhe sono uguali e lo 0 viene identificato in C come «negazione», quindi bisogna utilizzare l’operatore di negazione «!»

>Le stringhe 1 e 2 sono ugualiLe stringhe 1 e 3 sono uguali nei primi 5 caratteri

Page 54: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la ricerca nelle stringhe

14/03/2019 54Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

char *strchr( const char *s, int c ); Individua la prima occorrenza del carattere c nellastringa s. Se viene trovata, restituisce un puntatore al carattere c. Altrimenti un puntatore null.

char *strrchr( const char *s, int c );Individua l’ultima occorrenza del carattere c nellastringa s. Se viene trovata, restituisce un puntatore al carattere c. Altrimenti un puntatore null.

char *strpbrk( const char *s1, const char *s2 ); Individua la prima occorrenza di uno dei caratteri dellastringa s2 nella stringa s1. Se viene trovata, restituisceun puntatore al carattere nella stringa s1. Altrimentiun puntatore null.

char *strstr( const char *s1, const char *s2 );Individua la prima occorrenza della stringa s2 nellastringa s1. Se viene trovata, restituisce un puntatore al primo carattere di s1. Altrimenti un puntatore null.

Page 55: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la ricerca nelle stringhe

14/03/2019 55Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

size_t strspn( const char *s1, const char *s2 ); Determina e restituisce la lunghezza del segmentoiniziale della stringa s1 che è composta SOLO da caratteri contenuti in s2.

size_t strcspn( const char *s1, const char *s2 ); Determina e restituisce la lunghezza del segmentoiniziale della stringa s1 che è composta da caratteriNON contenuti in s2.

Page 56: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Ricerca nelle Stringhe

14/03/2019 56Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

int main(void) {

// Stringa di test per valutare le funzioni

char stringa[] = "test-funzione";

// Restituisce un puntatore alla prima occorrenzza di 'f' in 'stringa’

char* stringa_rimanente = strchr(stringa,'f’);

puts(stringa_rimanente);

// Restituisce la lunghezza del segmento di caratteri che NON comprendono "-f"

int lunghezza_segmento = strcspn(stringa,"-f");

printf("%d", lunghezza_segmento);

return 0;

}

Cosa stampa?

Page 57: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Ricerca nelle Stringhe

14/03/2019 57Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

int main(void) {

// Stringa di test per valutare le funzioni

char stringa[] = "test-funzione";

// Restituisce un puntatore alla prima occorrenzza di 'f' in 'stringa’

char* stringa_rimanente = strchr(stringa,'f’);

puts(stringa_rimanente);

// Restituisce la lunghezza del segmento di caratteri che NON comprendono "-f"

int lunghezza_segmento = strcspn(stringa,"-f");

printf("%d", lunghezza_segmento);

return 0;

}

Cosa stampa?

>funzione4

Page 58: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Ricerca nelle Stringhe

14/03/2019 58Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

int main(void) {

// Stringa di test per valutare le funzioni

char stringa[] = "test-funzione";

// Restituisce un puntatore alla prima occorrenzza di 'f' in 'stringa’

char* stringa_rimanente = strchr(stringa,'f’);

puts(stringa_rimanente);

// Restituisce la lunghezza del segmento di caratteri che comprendono "-f"

int lunghezza_segmento = strspn(stringa,"-f");

printf("%d", lunghezza_segmento);

return 0;

}

Cambia se uso strspn?

Page 59: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Ricerca nelle Stringhe

14/03/2019 59Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

#include <stdio.h>

#include <string.h>

int main(void) {

// Stringa di test per valutare le funzioni

char stringa[] = "test-funzione";

// Restituisce un puntatore alla prima occorrenzza di 'f' in 'stringa’

char* stringa_rimanente = strchr(stringa,'f’);

puts(stringa_rimanente);

// Restituisce la lunghezza del segmento di caratteri che comprendono "-f"

int lunghezza_segmento = strspn(stringa,"-f");

printf("%d", lunghezza_segmento);

return 0;

}

Cambia se uso strspn?

>funzione0

Page 60: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la ricerca nelle stringhe

14/03/2019 60Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prototipo Descrizione

char *strtok( char *s1, const char *s2 );La funzione serve a dividere s1 in ‘token’, cioè pezzi di testo (generalmente si tratta di parole) sulla base deicaratteri contenuti nella stringa s2 (che fungono da separatori).

int strlen( char *s1 ); Restituisce la lunghezza della stringa s1.

Page 61: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Tokenizzazione

14/03/2019 61Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

int main () {

// Stringa di prova

char stringa[] = "Provo La Funzione Di Tokenizzazione";

// Utilizzo lo Spazio Come Separatore

const char separatore[2] = " ";

char *token;

// Memorizzo il primo token

token = strtok(stringa, separatore);

// Ottengo iterativamente gli altri token (e ne stampo uno per riga) */

while( token != NULL ) {

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

token = strtok(NULL, separatore);

}

}

Cosa stampa?

Page 62: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Tokenizzazione

14/03/2019 62Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

int main () {

// Stringa di prova

char stringa[] = "Provo La Funzione Di Tokenizzazione";

// Utilizzo lo Spazio Come Separatore

const char separatore[2] = " ";

char *token;

// Memorizzo il primo token

token = strtok(stringa, separatore);

// Ottengo iterativamente gli altri token (e ne stampo uno per riga) */

while( token != NULL ) {

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

token = strtok(NULL, separatore);

}

}

Cosa stampa?

>ProvoLaFunzioneDiTokenizzazione

Page 63: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la conversione delle stringhe

14/03/2019 63Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Prendono in input una stringa e restituiscono in output la stringa convertita in un numero.

Prototype Descriptiondouble atof( const char *nPtr ); Converte la Stringa nPtr in double.

int atoi( const char *nPtr ); Converte la Stringa nPtr in int.

long atol( const char *nPtr ); Converte la Stringa nPtr In long int.

double strtod( const char *nPtr, char **endPtr ); Converte la Stringa nPtr in double.

long strtol( const char *nPtr, char **endPtr, int base ); Converte la Stringa nPtr in long.

unsigned long strtoul( const char *nPtr, char **endPtr, int base ); Converte la Stringa nPtr in unsigned long.

Page 64: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la conversione delle stringhe

14/03/2019 64Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Il comportamento delle funzioni può anche essere immaginato intuitivamente, analizzando i nomi

a = alphabet, i = integer, l = long, d = double, etc.

Prototype Descriptiondouble atof( const char *nPtr ); Converte la Stringa nPtr in double.

int atoi( const char *nPtr ); Converte la Stringa nPtr in int.

long atol( const char *nPtr ); Converte la Stringa nPtr In long int.

double strtod( const char *nPtr, char **endPtr ); Converte la Stringa nPtr in double.

long strtol( const char *nPtr, char **endPtr, int base ); Converte la Stringa nPtr in long.

unsigned long strtoul( const char *nPtr, char **endPtr, int base ); Converte la Stringa nPtr in unsigned long.

Page 65: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

1 #include <stdio.h>

2 #include <stdlib.h>3

4 int main()

5 {

6 double d; /* variable to hold converted string */7

8 d = atof( "99.0" );9

10 printf( "%s%.3f\n%s%.3f\n",

11 "The string \"99.0\" converted to double is ", d,

12 "The converted value divided by 2 is ",

13 d / 2.0 );14

15 return 0; 16

17 }

Funzioni per la conversione delle stringhe - Esempi

14/03/2019 65Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

The string "99.0" converted to double is 99.000The converted value divided by 2 is 49.500

Una volta effettuata la conversione la variabile

diventa un normalenumero ed è possible

utilizzarla nelle diverse operazioni

Page 66: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la conversione delle stringhe - Esempi

14/03/2019 66Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

The string "99.0" converted to double is 99.000The converted value divided by 2 is 49.500

1 #include <stdio.h>

2 #include <stdlib.h>3

4 int main()

5 {

6 double d; /* variable to hold converted string */7

8 d = atof( "99.0" );9

10 printf( "%s%.3f\n%s%.3f\n",

11 "The string \"99.0\" converted to double is ", d,

12 "The converted value divided by 2 is ",

13 d / 2.0 );14

15 return 0; 16

17 }

La funzione prende in input un valore in formato stringa e lo converte in un float (o in un altro formato, a seconda della funzione)

Page 67: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la conversione delle stringhe - Esempi

14/03/2019 67Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

La funzione prende in input un valore in formato stringa e lo converte in un float (o in un altro formato, a seconda della funzione). La parte rimanente viene memorizzata in una ulteriore stringa.

3 #include <stdio.h>

4 #include <stdlib.h>

5

6 int main()

7 {

8 /* initialize string pointer */

9 const char *string = "51.2% are admitted";

10

11 double d; /* variable to hold converted sequence */

12 char *stringPtr; /* create char pointer */

13

14 d = strtod( string, &stringPtr );

15

16 printf( "The string \"%s\" is converted to the\n", string );

17 printf( "double value %.2f and the string \"%s\"\n", d, stringPtr );

18

19 return 0;

20

21 } /* end main */

The string "51.2% are admitted" is converted to the double value 51.20 and the string "% are admitted"

Page 68: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Funzioni per la manipolazione delle stringhe

14/03/2019 68Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Permettono di copiare una parte dei caratteri di una stringa in un’altra stringa oppure di concatenare due stringa in una più grande

Prototype Description

char *strcpy( char *s1, const char *s2 ) Copies string s2 into array s1. The value of s1 is returned.

char *strncpy( char *s1, const char *s2, size_t n ) Copies at most n characters of string s2 into array s1. The value of s1 is returned.

char *strcat( char *s1, const char *s2 ) Appends string s2 to array s1. The first character of s2 overwrites the terminating null character of s1. The value of s1 is returned.

char *strncat( char *s1, const char *s2, size_t n ) Appends at most n characters of string s2 to array s1. The first character of s2 overwrites the terminating null character of s1. The value of s1 is returned.

Page 69: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Manipolazione

14/03/2019 69Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 int main() {

2 char string_a[] = "Provo ";

3 char string_b[] = "A Concatenare";

4 char string_c[] = "";

5 char string_d[] = "Copio Stringa";

6

7 // Concateno la Stringa B alla Stringa A

8 printf("%s \n", strcat(string_a, string_b));

9 // Concateno la Stringa B alla Stringa A (primi 15 caratteri)

10 printf("%s \n", strncat(string_c, string_a, 15));

11 // Concateno la Stringa B alla Stringa A (primi 15 caratteri)

12 strcpy(string_c, string_d);

13 printf("%s \n%s", string_c, string_d);

14 return 0;

15 }

Cosa stampa?

Page 70: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe – Manipolazione

14/03/2019 70Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

1 int main() {

2 char string_a[] = "Provo ";

3 char string_b[] = "A Concatenare";

4 char string_c[] = "";

5 char string_d[] = "Copio Stringa";

6

7 // Concateno la Stringa B alla Stringa A

8 printf("%s \n", strcat(string_a, string_b));

9 // Concateno la Stringa B alla Stringa A (primi 15 caratteri)

10 printf("%s \n", strncat(string_b, string_a, 15));

11 // Concateno la Stringa B alla Stringa A (primi 15 caratteri)

12 strcpy(string_c, string_d);

13 printf("%s \n%s", string_c, string_d);

14 return 0;

15 }

Cosa stampa?

>Provo a ConcatenareProvo a ConcateCopio StringaCopio Stringa

Page 71: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Manca qualcosa!

14/03/2019 71Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 72: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Stringhe

14/03/2019 72

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 scanf("%9s", string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Importante: la scanf( ) si ferma se trova un

terminatore o uno spazio

Come risolviamo?

Page 73: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 73

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 gets(string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Soluzione 1: utilizzo di gets

Page 74: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 74

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 gets(string);

7 printf("Stringa letta: ");

8 puts(string);

9 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Soluzione 1: utilizzo di gets

Non ottimale, perché risolve il problema dello spazio non abbiamo la garanzia che

vengano letti max ‘LENGTH’ caratteri

Page 75: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 75

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 fgets(string, LENGTH, stdin);

7 printf("Stringa letta: ");

8 puts(string);

9 fpurge(stdin);

10 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Soluzione 2: utilizzo di fgets

Page 76: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 76

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 fgets(string, LENGTH, stdin);

7 printf("Stringa letta: ");

8 puts(string);

9 fpurge(stdin);

10 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Soluzione 2: utilizzo di fgets

Parametri: nome della stringa, numero di caratteri da leggere e flusso di input

(sempre stdin)

Page 77: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 77

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 fgets(string, LENGTH, stdin);

7 printf("Stringa letta: ");

8 puts(string);

9 fpurge(stdin);

10 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Vantaggi: (1) Possiamo utilizzare

gli spazi(2) Il buffer di lettura

viene limitato a‘LENGTH’caratteri, quindinon ci sarà nessunrischio di buffer overflow!

(Nb) Legge 9 caratteri e aggiunge il terminatore.

Page 78: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 78

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string[LENGTH];

5 printf("Inserisci Stringa: ");

6 fgets(string, LENGTH, stdin);

7 printf("Stringa letta: ");

8 puts(string);

9 fpurge(stdin);

10 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Vantaggi: (1) Possiamo utilizzare

gli spazi(2) Il buffer di lettura

viene limitato a‘LENGTH’caratteri, quindinon ci sarà nessunrischio di buffer overflow!

Cosa succede sescrivo piùcaratteri?

Page 79: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 79

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char string2[LENGTH];

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 printf("Inserisci Stringa: ");

11 fgets(string2, LENGTH, stdin);

12 printf("Stringa letta: ");

13 puts(string2);

14 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

I caratteri extra non vengono persi, restano nel buffer. In caso di ulteriore lettura di dati questi si concatenano alla nuova stringa

Page 80: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 80

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char string2[LENGTH];

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 printf("Inserisci Stringa: ");

11 fgets(string2, LENGTH, stdin);

12 printf("Stringa letta: ");

13 puts(string2);

14 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

>Inserisci Stringa:bla bla blaStringa letta:Bla bla bInserisci Stringa:la

Page 81: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 81

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char string2[LENGTH];

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 printf("Inserisci Stringa: ");

11 fgets(string2, LENGTH, stdin);

12 printf("Stringa letta: ");

13 puts(string2);

14 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

>Inserisci Stringa:bla bla blaStringa letta:Bla bla bInserisci Stringa:la

Bisogna svuotare il buffer dai dati extra che sono stati letti!

Page 82: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 82

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char string2[LENGTH];

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 fflush(stdin) // oppure fpurge(stdin) o __fpurge(stdin)

11 printf("Inserisci Stringa: ");

12 fgets(string2, LENGTH, stdin);

13 printf("Stringa letta: ");

14 puts(string2);

15 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 83: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Come risolviamo?

14/03/2019 83

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char string2[LENGTH];

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 fflush(stdin) // oppure fpurge(stdin) o __fpurge(stdin)

11 printf("Inserisci Stringa: ");

12 fgets(string2, LENGTH, stdin);

13 printf("Stringa letta: ");

14 puts(string2);

15 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Nota: fflush( ) sualcuni ambienti(es. Repl) spesso

non funziona, mentre fpurge(o __ffpurge)

non è una funzione

‘standard’ del C, dunque genera

dei warning

Page 84: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Soluzione

14/03/2019 84

1 #include "stdio.h“

2 #define LENGTH 10

3 int main(void) {

4 char string1[LENGTH];

5 char c;

6 printf("Inserisci Stringa: ");

7 fgets(string1, LENGTH, stdin);

8 printf("Stringa letta: ");

9 puts(string1);

10 while((c = getchar()) != '\n' && c != EOF);

11 printf("Inserisci Stringa: ");

12 fgets(string2, LENGTH, stdin);

13 printf("Stringa letta: ");

14 puts(string2);

15 }

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Soluzione alternativa a fflush( ) o fpurge( )

Tutti i caratteri rimanenti nel

buffer (fino a ‘\n’) sono memorizzati nella variabile ‘c’ e

tolti dal buffer

Page 85: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Elaborazione di Stringhe

14/03/2019 85

• Approfondimenti:• Capitolo 8 del libro Deitel & Deitel

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Page 86: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

14/03/2019 86

Esercizio 3.2

Cataldo Musto - Linguaggio C (parte 3)Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019

Estendere l’esercizio 3.1 inserendo delle istruzioni checalcolino il “livello di sicurezza” della password inseritadall’utente.

Una password è detta ‘sicura’ se contiene più di 5 caratteri speciali e numeri (in totale). Una password è ‘mediamente sicura’ se il numero è compreso tra 3 e 5, altrimenti è poco sicura

Page 87: Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS, Track B) –Universitàdegli Studi di Bari –A.A. 2018/2019 Prototipo Descrizione

Domande?

14/03/2019 87Cataldo Musto - Linguaggio C (parte 3)

Laboratorio di Informatica (ITPS, Track B) – Università degli Studi di Bari – A.A. 2018/2019