Leggere e controllare i dati in ingresso in C e C++
In questa lezione leggerai i dati inseriti dall'utente e rifiuterai i valori non validi in C e in C++.
Introduzione
Leggere i dati dall'utente può sempre fallire, per esempio quando il programma si aspetta un numero e l'utente scrive delle lettere. Per questo il programma deve controllare il risultato della lettura invece di dare per scontato che i dati siano sempre corretti.
Punti importanti
- Attiva gli avvisi del compilatore (compiler warning) e correggili tutti.
- Comprendi bene il tipo di dato e la durata (lifetime) di ogni valore.
- Controlla sempre i dati in ingresso e i limiti degli indici degli array.
Esempi di codice C e C++
#include <stdio.h>
int main(void) {
int age;
printf("Age: ");
if (scanf("%d", &age) != 1 || age < 0) {
puts("Invalid age");
return 1;
}
printf("Next year: %d\n", age + 1);
return 0;
}
Age: 20
Next year: 21
#include <iostream>
int main() {
int age;
std::cout << "Age: ";
if (!(std::cin >> age) || age < 0) {
std::cerr << "Invalid age\n";
return 1;
}
std::cout << "Next year: " << age + 1 << '\n';
}
Age: 20
Next year: 21
Confronto tra C e C++
In C, scanf restituisce quanti valori ha letto correttamente, quindi la condizione scanf(...) != 1 indica che la lettura dell'età è fallita. In C++, quando std::cin non riesce a leggere il dato nel tipo richiesto, entra in uno stato di errore e l'espressione di controllo risulta falsa. Entrambi i programmi rifiutano anche le età negative.
C usa piccole funzioni procedurali e mostra apertamente come i dati sono rappresentati in memoria.
C++ continua a permettere il lavoro a basso livello, ma aggiunge tipi di libreria e astrazioni più sicure.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Prova input non validi e valori ai limiti.
- Compila con i flag -Wall -Wextra -Wpedantic per attivare più avvisi.
- Sposta le dichiarazioni condivise in un file header e l'implementazione in un altro file.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Average of Three Average three whole numbers. Facile
- Rectangle Perimeter Compute the perimeter of a rectangle from its sides. Facile