Concatenazione di stringhe

C:
Concatenazione di stringhe

Come fare:

In C, le stringhe sono array di caratteri che terminano con un carattere nullo (\0). A differenza dei linguaggi di livello superiore, C non fornisce una funzione di concatenazione di stringhe incorporata. Invece, si utilizzano le funzioni strcat() o strncat() dalla libreria <string.h>.

Ecco un semplice esempio utilizzando strcat():

#include <stdio.h>
#include <string.h>

int main() {
    char destinazione[50] = "Ciao, ";
    char sorgente[] = "Mondo!";

    strcat(destinazione, sorgente);

    printf("%s\n", destinazione);  // Output: Ciao, Mondo!
    return 0;
}

La funzione strcat() prende due argomenti: la stringa di destinazione (che deve avere abbastanza spazio per contenere il risultato concatenato) e la stringa sorgente. Quindi, aggiunge la stringa sorgente alla stringa di destinazione.

Per avere più controllo sul numero di caratteri concatenati, strncat() è più sicura da usare:

#include <stdio.h>
#include <string.h>

int main() {
    char destinazione[50] = "Ciao, ";
    char sorgente[] = "Mondo!";
    int num = 3; // Numero di caratteri da aggiungere

    strncat(destinazione, sorgente, num);

    printf("%s\n", destinazione);  // Output: Ciao, Mon
    return 0;
}

Questo limita la concatenazione ai primi num caratteri della stringa sorgente, aiutando a prevenire overflow del buffer.

Approfondimento

Le funzioni strcat() e strncat() fanno parte della libreria standard di C fin dalla sua nascita, riflettendo la natura a basso livello del linguaggio che richiede la gestione manuale delle stringhe e della memoria. A differenza di molti linguaggi di programmazione moderni che trattano le stringhe come oggetti di prima classe con operatori di concatenazione incorporati (come + o .concat()), l’approccio del C richiede una comprensione più approfondita dei puntatori, dell’allocazione della memoria e dei potenziali pericoli come gli overflow del buffer.

Sebbene strcat() e strncat() siano ampiamente utilizzati, sono spesso criticati per il loro potenziale di creare vulnerabilità di sicurezza se non usati con attenzione. Gli overflow del buffer, dove i dati superano la memoria allocata, possono portare a crash o essere sfruttati per l’esecuzione arbitraria di codice. Di conseguenza, i programmatori stanno sempre più orientandosi verso alternative più sicure, come snprintf(), che offre un comportamento più prevedibile limitando il numero di caratteri scritti nella stringa di destinazione in base alla sua dimensione:

char destinazione[50] = "Ciao, ";
char sorgente[] = "Mondo!";
snprintf(destinazione + strlen(destinazione), sizeof(destinazione) - strlen(destinazione), "%s", sorgente);

Questo metodo è più prolisso ma significativamente più sicuro, evidenziando un cambiamento nelle pratiche di programmazione C verso la priorità a sicurezza e robustezza rispetto alla brevità.

Nonostante queste sfide, la concatenazione di stringhe in C è una competenza fondamentale, cruciale per una programmazione efficace nel linguaggio. Comprendere le sue sfumature e i rischi associati è chiave per padroneggiare la programmazione in C.