Risolto array di caratteri

matbas

Utente Iron
28 Luglio 2023
5
2
1
4
salve,
sto cercando per diletto di apprendere il linguaggio C svolgendo qualche semplice esercizio.
sto cercando di popolare un array di char e poi stamparne il contenuto....ma qualcosa non va...quando eseguo il primo ciclo for mi salta un ciclo e non capisco perchè...qualcuno sarebbe così gentile di indicarmi l'errore? ringrazio anticipatamente per l'aiuto...

C:
#include <stdio.h>

int main(void)
{
    char l;
    char a[4];

    for(int i = 0; i < 4; i++)
    {
        printf("inserisci carattere: ");
        scanf("%c", &a[i]);
    }
   
    for(int i = 0; i<4; i++)
    {
        printf("%c", a[i]);
    }
    return 0;
   
}
 
Ultima modifica:
Il problema è la funzione scanf(), che spesso non permette la giusta acquisizione dei caratteri, in quanto va a leggere anche gli spazi vuoti rimasti nel flusso del buffer di memoria. scanf(), infatti, smette di leggere appena trova uno spazio vuoto. Nel tuo caso la funzione acquisisce due spazi vuoti: il primo è quello che hai lasciato nella stringa "inserisci carattere: " e l'altro viene acquisito quando premi il tasto di invio, durante l'inserimento del primo carattere (che corrisponde ad inserire nel flusso del buffer un carattere di fine riga \n, equivalente ad un secondo spazio vuoto). Di conseguenza due caratteri vengono saltati nel ciclo for. Basta aggiungere uno spazio prima del %c nel primo ciclo for, in modo da "pulire" il flusso di input da eventuali spazi vuoti e il tuo codice torna a funzionare:

C:
#include <stdio.h>

int main(void)
{
    char a[4];

    for(int i = 0; i < 4; i++)
    {
        printf("inserisci carattere: ");
        scanf(" %c", &a[i]);
    }
 
    for(int i = 0; i<4; i++)
    {
        printf("%c", a[i]);
    }
    return 0;
 
}
 
Ultima modifica:
Se invece utilizzassi getchar()...quale potrebbe essere eventuale problema?
Lo stesso problema che hai riscontrato con scanf(). Se vuoi aggirare questa cosa puoi provare ad utilizzare la funzione fgets() nel tuo codice. Questa funzione ti permette di leggere una stringa per intero, anche con gli spazi. L'unica accortezza che devi avere è nel passaggio degli argomenti alla funzione: ossia l'array, il numero di caratteri da acquisire (che deve essere sempre n+1 grande della dimensione n da acquisire. Per esempio, se devi leggere 4 caratteri allora devi passare 5 come argomento) e il flusso, in questo caso è il flusso standard input da tastiera, quindi stdin. Verrebbe fuori qualcosa del genere:

C:
#include <stdio.h>

int main()
{  
    const int N = 5;
   
    char arr[N];
   
    printf("Inserisci i caratteri dell'array (4 caratteri):");
    fgets(arr, N, stdin);
   
    for (int i = 0; i < N; i++){
        printf("%c", arr[i]);
    }

    return 0;
}