Fondamenti di C/C++

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++

C
Esegui →
main.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;
}
Risultato dell'esecuzione
Age: 20
Next year: 21
C++
Esegui →
main.cpp
#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';
}
Risultato dell'esecuzione
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

C usa piccole funzioni procedurali e mostra apertamente come i dati sono rappresentati in memoria.

C++

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.

Tutte le sfide