19stellare92 ha scritto:Innanzitutto ti ringrazio per la risposta Obidream, ho studiato il tuo codice ed ho scoperto alcune cose interessanti,ad esempio che posso usare nella dichiarazione di funzione le stesse variabili usate per i parametri attuali. Questo comporta qualcosa all'interno della memoria?Non mi è chiaro se vengono generate nuove copie o se vengono usate le stesse dei parametri formali.
Per quanto riguarda il gets() ho trovato questa possibilità leggendo nei forum, tu come faresti a creare una stringa composta da piu parole,usi un ciclo?
Quando ti riferisci al fatto che è incasinato il codice intendi che dovrei seguire di piu il tuo stile e quindi per ogni "attività" che voglio realizzare generare una funzione a parte?
Scusa per tutte le domande ma ci tengo davvero a migliorare e mi piacerebbe correggere i miei errori.
In C le stringhe sono degli array di caratteri null-terminated ( terminate dal carattere \0) pertanto il passaggio ad una funzione avviene sempre per riferimento e non per copia. Tant'è che la seguente funziona modifica direttamente la stringa che gli passi come parametro:
- Codice:
static void reverse_string(char *s, size_t len)
{
size_t i = 0;
for(i = 0; i < (len >> 1) - 1; ++i) {
swap_ch(&s[i], &s[len - i - 1]);
}
}
Comunque non intendevo dire che il tuo codice è incasinato, non mi permetterei di farlo. Ed il mio modo di scrivere il codice non è necessariamente il migliore, è quello che trovo personalmente più leggibile in base a quella che è la mia seppur ridotta esperienza, ma non mi sento di dirti che ad ogni attività deve corrispondere una funzione.
Sebbene l'argomento sia in realtà non banale, in generale è una buona idea usare le funzioni per rendere il codice più leggibile, anziché scrivere tutto nel main, questo si può dire
Infine, la gets() ha un problema semplice, così come molte funzioni della libreria standard del C per la gestione delle stringhe: non c'è alcun controllo sulla lunghezza della stringa, se tu ne crei una da 20 caratteri e ne inserisci 25 non hai nessun errore apparentemente. È quello che si chiama buffer overflow in gergo tecnico.
Un'alternativa semplice è quella di usare fgets, che permette di leggere anche dallo stdin. L'unica differenza è che include eventualmente anche il \n di quando premi invio, quindi bisogna tenerne conto.