1. Introduzione: L’importanza della conversione tra stringhe e numeri in C
Nella programmazione C, convertire tra stringhe e numeri è un’operazione cruciale. Questo è particolarmente importante quando si gestiscono input dell’utente o si elaborano dati provenienti da file esterni, dove spesso è necessario convertire le stringhe in numeri. Al contrario, è comune convertire i numeri in stringhe per visualizzare i risultati di calcoli o scrivere log.
Esistono diversi metodi per tali conversioni, e la scelta di quello giusto dipende dal caso d’uso. Questo articolo spiegherà in dettaglio come convertire tra stringhe e numeri in C, includendo la gestione degli errori e le pratiche sicure.
2. Come convertire le stringhe in numeri in C
Conversione base da stringa a intero usando atoi()
Il modo più semplice per convertire una stringa in un intero in C è utilizzare la funzione atoi(). Questa funzione è facile da usare, ma presenta importanti avvertenze. Ecco un esempio di utilizzo base:
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[] = "123";
int num = atoi(str);
printf("Converted value: %dn", num);
return 0;
}
Sebbene atoi() sia semplice, non effettua un controllo adeguato degli errori. Per esempio, non segnala un errore anche se l’input è non valido. L’esempio seguente mostra come atoi() si comporta con una stringa non valida:
char str[] = "123abc";
int num = atoi(str); // Only "123" is converted; the rest is ignored
Poiché atoi() restitita anche se la stringa contiene caratteri non validi, non dovrebbe essere usata in sistemi dove sono richieste sicurezza e affidabilità.
Conversione sicura con strtol()
Se è necessario il controllo degli errori, è consigliato utilizzare la funzione strtol(). strtol() consente di gestire gli errori dovuti a input non valido e permette anche di specificare la base numerica per la conversione. Ecco un esempio di conversione sicura di una stringa in un intero usando strtol():
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
char str[] = "123abc";
char *endptr;
errno = 0; // Reset error state
long num = strtol(str, &endptr, 10);
if (errno != 0 || *endptr != ' ') {
printf("Conversion failed.n");
} else {
printf("Converted value: %ldn", num);
}
return 0;
}
Questo codice utilizza endptr per rilevare parti non valide nella stringa e controlla anche errno per intercettare errori come overflow o underflow.

3. Come convertire i numeri in stringhe in C
La funzione sprintf() e i suoi rischi
Per convertire i numeri in stringhe, si usa la funzione sprintf(). sprintf() converte un numero in una stringa secondo il formato specificato e lo scrive in un buffer. Tuttavia, è necessario fare attenzione ai rischi di overflow del buffer. Ecco un esempio base:
#include <stdio.h>
int main() {
int num = 123;
char str[10];
sprintf(str, "%d", num);
printf("Converted string: %sn", str);
return 0;
}
Mentre questo converte un intero in una stringa, se la stringa risultante supera la dimensione del buffer, può verificarsi un overflow del buffer.
Conversione sicura con snprintf()
Per prevenire l’overflow del buffer, è consigliato usare snprintf(). snprintf() permette di specificare la dimensione del buffer e l’output che supera tale dimensione verrà troncato. Ecco un esempio:
#include <stdio.h>
int main() {
int num = 12345;
char str[5];
snprintf(str, sizeof(str), "%d", num);
printf("Converted string: %sn", str); // Result is "1234" because buffer is too small
return 0;
}
In questo esempio l’output viene troncato perché supera la dimensione del buffer. snprintf() è un modo sicuro per evitare overflow del buffer impostando esplicitamente la lunghezza del buffer.
4. Esempio pratico: Conversione bidirezionale tra stringhe e numeri
In C è comune convertire le stringhe in numeri e viceversa. Il codice seguente dimostra la conversione bidirezionale usando sscanf() e snprintf():
#include <stdio.h>
int main() {
char str[] = "12345";
int num;
sscanf(str, "%d", &num);
printf("String to number: %dn", num);
char new_str[10];
snprintf(new_str, sizeof(new_str), "%d", num);
printf("Number to string: %sn", new_str);
return 0;
}
Qui, sscanf() viene usato per convertire una stringa in un numero, e poi snprintf() converte il numero nuovamente in una stringa. La conversione bidirezionale è estremamente utile quando si elaborano dati di input e si visualizzano i risultati.
5. Gestione degli Errori e Punti Importanti
Gestione di Overflow e Underflow
Durante la conversione di numeri in stringhe, possono verificarsi overflow o underflow. Se il valore convertito supera l’intervallo del tipo di dato, possono verificarsi errori. Quando si utilizza strtol() o sscanf(), è importante gestire gli errori in modo appropriato, come mostrato di seguito:
if (errno == ERANGE) {
printf("Overflow or underflow occurred.n");
}
Controllando errno, è possibile determinare se si è verificato un errore. Una corretta gestione degli errori per overflow e underflow impedisce al programma di comportarsi in modo inatteso.
Come Gestire Input Non Valido
Se il formato della stringa è non valido, la conversione in numero fallirà. Per esempio, provare a convertire una stringa come "123abc" convertirà solo la parte numerica, ignorando il resto. Per evitare ciò, usa il puntatore restituito da strtol() per verificare eventuali errori di conversione.
char *endptr;
long num = strtol(str, &endptr, 10);
if (*endptr != ' ') {
printf("Invalid input detected.n");
}
6. Riepilogo
Per garantire la stabilità dei tuoi programmi, esegui sempre controlli sugli errori e utilizza metodi sicuri per convertire numeri e stringhe. Sebbene atoi() sia facile da usare, non gestisce gli errori, quindi è generalmente consigliato utilizzare funzioni più sicure come strtol(), sscanf() e snprintf().
La conversione tra stringhe e numeri in C è una competenza fondamentale per i programmatori. Padroneggiare questa abilità ti aiuterà a scrivere programmi più robusti. Una corretta gestione degli errori e della memoria contribuisce inoltre a scrivere software sicuro e affidabile.
Approfondimenti
Se desideri approfondire l’argomento, consulta la documentazione ufficiale o esamina il codice di progetti open‑source. Esistono anche numerosi libri sulla gestione degli errori e della memoria in C, fortemente consigliati.


