[C] Problema con stampa numeri

oleg.fresi
Ho un esercizio in c in cui devo realizzare una funzione che generi casualmente un array di char, ciè passato per parametro un array di char con massimo 9 elementi, riempire questo con dei valori casuali tra lettere maiuscole e numeri in maniera tale che le prime 4 posizioni siano lettere e le restanti 5 siano numeri. Per ora mi sono concentrato sull corretta stampa dei valori, poi scriverò una riga di codice per generare i valori casuali. Il problema che riscontro è nella stampa: vengono stampate correttamente le prima 4 lettere, poi un simbolo strano e 4 numeri. Il problema è che non capisco il perchè di quel simbolo strano. Posto sotto il codice:
#include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    void generaCharArrayCasuale(char cod[])
    {
        const char lettere[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
        const int numeri[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        //const char numeri[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

        for(int i = 0; i < 4; i++)
            cod[i] = lettere[3];

        for(int i = 4; i < 9; i++)
            cod[i] = numeri[4];
    }


    int main(void)
    {
        srand(time(NULL));

       char nome[9];

        generaCharArrayCasuale(nome);

        for(int i = 0; i < 4; i++)
            printf(" %c", nome[i]);
        printf("\n");

        for(int i = 4; i < 9;i++)
            printf("%d", nome[i]);

        return 0;
    }



Potreste aiutarmi a capire l'errore?

Risposte
Super Squirrel
Tralasciando per il momento che il tutto può essere fatto senza distinzioni tra char e int e senza gli array lettere e numeri, i problemi stanno nella dimensione di nome e nelle condizioni dei for.

oleg.fresi
Ora ho corretto il codice e sembra che funzioni.

oleg.fresi
MI hai detto che si potrebbe fare in un altro modo, ma quale, se non mettendo in un unico vettore lettere e numeri.

apatriarca
In credo qualsiasi codifica di caratteri sia le cifre che le lettere dell'alfabeto sono rappresentati in ordine in cifre consecutive. Quindi per esempio [tt]'A' + 2 == 'C'[/tt]. Quindi puoi generare le 4 lettere e cinque cifre nel seguente modo:
for (int i = 0; i < 4; ++i) { cod[i] = random_int('A', 'Z'); }
for (int i = 0; i < 5; ++i) { cod[i + 4] = random_int('0', '9'); }

dove [tt]random_int[/tt] è una funzione che restituisce un numero intero contenuto tra i due argomenti (compresi). Può essere implementata con qualcosa tipo il seguente (il codice è biased e ci sono altri modi migliori ma questo è il metodo più semplice):
int random_int(int a, int b) {
   return a + rand() % (b - a + 1);
}

oleg.fresi
Grazie, mi piace questa alternativa, ma mi è sorto un altro guaio. Dovendo far inserire un carattere per volta nell'array, come gestire il caso in cui l'utente in una chiamata di scanf inserisce due caratteri? Cioè, se l'utente deve inserire CIAO, alla prima chiamata inserisce C, alla seconda anziche inserire I, inserisce IA, dove poi la A si perde. Come segnalare questo errore, ovvero come segnalare che sono stati inseriti più di un carattere?

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