laboratorio di informaticaswap/labinf1819/5_linguaggio_c_parte_3.pdflaboratoriodi informatica (itps,...
TRANSCRIPT
![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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/1.jpg)
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
![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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/2.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/3.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/4.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/6.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/7.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/10.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/11.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/12.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/13.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/14.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/15.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/16.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/18.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/19.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/20.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/21.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/22.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/23.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/24.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/25.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/26.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/27.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/28.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/29.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/30.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/31.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/32.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/33.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/34.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/35.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/36.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/37.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/38.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/39.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/40.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/41.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/42.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/43.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/44.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/45.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/46.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/47.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/48.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/49.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/50.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/51.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/52.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/53.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/54.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/55.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/56.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/57.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/58.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/59.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/60.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/61.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/62.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/63.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/64.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/65.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/66.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/67.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/68.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/69.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/70.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/71.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/72.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/73.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/74.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/75.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/76.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/77.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/78.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/79.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/80.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/81.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/82.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/83.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/84.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/85.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/86.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022041112/5f174d5081b865679333f9d9/html5/thumbnails/87.jpg)
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