Fondamenti di C/C++

Array e stringhe in C e C++

In questa lezione scorrerai un array di dimensione fissa e calcolerai in modo sicuro la lunghezza di una stringa in C e C++.

Introduzione

Un array è una sequenza di elementi dello stesso tipo memorizzati uno dopo l'altro in memoria. In C una stringa è un array di caratteri che termina con il carattere nullo '\0'. In C++, invece, std::string gestisce da sola la propria memoria e conosce sempre la lunghezza del testo.

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.

Guarda come funziona

Una stringa in C è un array di caratteri che termina con '\0'. Fai clic su un carattere per vedere il suo indice e il suo indirizzo di memoria.

Esempi di codice C e C++

C
Esegui →
main.c
#include <stdio.h>
#include <string.h>

int main(void) {
    int values[] = {3, 5, 8, 13};
    char name[] = "Ada";
    size_t count = sizeof values / sizeof values[0];
    printf("%s: %zu values, %zu letters\n", name, count, strlen(name));
    return 0;
}
Risultato dell'esecuzione
Ada: 4 values, 3 letters
C++
Esegui →
main.cpp
#include <array>
#include <iostream>
#include <string>

int main() {
    std::array values{3, 5, 8, 13};
    std::string name = "Ada";
    std::cout << name << ": " << values.size()
              << " values, " << name.size() << " letters\n";
}
Risultato dell'esecuzione
Ada: 4 values, 3 letters

Confronto tra C e C++

L'espressione sizeof values / sizeof values[0] calcola il numero di elementi di un array dichiarato nella stessa funzione, ma non funziona con un array passato a una funzione come puntatore. La funzione strlen deve scorrere ogni carattere fino a trovare '\0' per conoscere la lunghezza, mentre std::string::size() la restituisce subito.

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