[C] Problema esercizio ricorsione

nick_10
Ciao a tutti!
Sempre problemi con le funzione ricorsive...
In questo esercizio son riuscito a fare solo una parte:
"Si scriva in C una funzione ricorsiva (che non deve pertanto fare uso di costrutti iterativi) che legga da input una sequenza di caratteri che termina con l’ingresso del carattere ’\n’, stampi a video la sequenza seguita dalla stessa sequenza in ordine invertito e, inoltre, restituisca in output il numero di caratteri inseriti. Ad esempio, se la sequenza letta fosse ’i’ d’ ’i ’ ’s’ la stampa prodotta sarebbe ’i’ d’ ’i ’ ’s’ ’s’ ’i ’ d’ ’i’ mentre l’output sarebbe 4".
In particolare la stampa dei caratteri è giusta. Non trovo il modo di contare i caratteri inseriti :(. Ho provato cosi:
#include <stdio.h>
int caratteriric(){
    char c;
    int occ;
    c=getchar();
    if(c != '\n'){   **
        putchar(c);
        occ=1+caratteriric();
        putchar(c);
    }
    return occ;
}
int main() {
    caratteriric();
    printf("Il numero di caratteri inseriti è:%d\n",caratteriric());
    return 0;
}

Che è giusto...cioè come output di caratteri inseriti fornisce effettivamente 4 ma nel punto di codice indicato con ** il compilatore mi dice questo: Variable 'occ' is used uninitialized whenever 'if' condition is false
Ma se all'inizio dichiaro int occ=0 il programma mi fornisce 0 come numero di caratteri inseriti

Risposte
vict85
Quella variabile è effettivamente non inizializzata se c == '\n'. Dovresti inizializzarlo a 0 e rimuovere il primo putchar.

nick_10
Se lo inizializzo a zero però poi mi stampa il valore 0 e inoltre se tolgo il primo putchar non mi stampa la prima parte della sequenza

apatriarca
Perché stai chiamando due volte la funzione nel main? Restituire zero nel caso in cui il valore letto sia quello di a capo è il comportamento corretto, per cui credo che il tuo problema possa essere un'altro..

nick_10
Così dovrebbe andare...
#include <stdio.h>
int caratteriric(){
    char c;
    int occ=0;
    c=getchar();
    if(c != '\n'){
        putchar(c);
        occ=1+caratteriric();
        putchar(c);
    }
    return occ;
}
int main() {
    printf("\nIl numero di caratteri inseriti è:%d\n",caratteriric());
    return 0;
}

vict85
Penso che sia più leggibile se memorizzi il valore di ritorno della funzione in una variabile e poi stampi la variabile.

nick_10
Grazie a tutti per i consigli!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.