Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS,...
Transcript of Laboratorio di Informaticaswap/labinf1819/5_Linguaggio_C_Parte_3.pdfLaboratoriodi Informatica (ITPS,...
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
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
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
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
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
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
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
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
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
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?
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?
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
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
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)
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)
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
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
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)
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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;
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
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
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?
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 }}
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!
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.
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.
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.
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?
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
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
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.
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.
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) ?
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 «!»
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
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.
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.
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?
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
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?
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
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.
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?
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
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.
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.
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
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)
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"
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.
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?
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
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
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?
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
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
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
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)
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.
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?
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
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
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!
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
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
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
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
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
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