Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Inserire ricorsivamente caratteri in un array

    Ciao ragazzi, ho due problemi, probabilmente banali. Sto facendo un esercizio del mio testo universitario che implica la creazione di due vettori di caratteri da parte dell'utente ed elabora un terzo vettore (w nel mio codice) i cui elementi sono quelli dei due array presi alternatamente.

    Il primo riguarda credo il buffer di lettura; se non metto fflush(stdin); dopo lo scanf quando raccolgo i caratteri immessi dall'utente, il programma richiede in input solo il carattere dell'elemento [1] dell'array, saltando il [0] e il [2] nel caso abbia messo come lunghezza dell'array 3. Tuttavia so che fflush non è un metodo molto buono.

    L'altro problema riguarda il fatto che se stampo i caratteri dell'array 2 mi da qualcosa di strano, cioé restituisce sempre come caratteri: [0] vuoto, [1] B, [2] y con due puntini sopra. Non ho provato per array di dimensioni >3 ma il concetto è quello.

    Terzo problema: l'array che dovrebbe avere gli elementi dei due array inseriti dall'utente, con gli elementi fatti così:

    se n=3
    v1[0]=a, v1[1] = b, v1[2] = c
    v2[0]=d, v2[1] = e, v1[2] = f
    w[0]=a, w[1] =d, w[2] = b, w[3] = e, w[4] = c, w[5] = f

    quando lo stampo mi restituisce perlopiù caratteri vuoti, sennò caratteri stranissimi.

    Immagino ci siano dei problemi di fondo che la mia pochissima conoscenza del C hanno fatto emergere con questo esercizio. Per inciso, sono un ultra neofita del C, ho iniziato a studiarlo da una settimana e mezza

    Grazie in anticipo!

    P.S.: Uso Code::Blocks

    Allego qui il mio codice:
    codice:
    // ESERCIZIO 5 CAPITOLO 7 - ARRAY DI CARATTERI ALTERNATI
    
    
    #include <stdio.h>
    #include <math.h>
    
    
    #define MAX_NUM 100
    
    
    main() {
    
    
        int n, i, j;
        char v1[MAX_NUM], v2[MAX_NUM], w[MAX_NUM];
    
    
        printf("ESERCIZIO 5 CAPITOLO 7");
        printf("\n\nLunghezza vettori: ");
        scanf("%d", &n);
        fflush(stdin);
    
    
        printf("\nVettore 1\n");
        for(i=0; i<n; i++){
            printf("%do elemento: ", i+1);
            scanf("%c", &v1[i]);
            fflush(stdin);
        }
    
    
        printf("\n\nVettore 2\n");
        for(i=0; i<n; i++){
            printf("%do elemento: ", i+1);
            scanf("%c", &v2[i]);
            fflush(stdin);
        }
    
    
        // Elaborazione e stampa vettore w
    
    
        printf("\n\nVettore w\n");
        for(i=0; i<(n*2); i++){
            w[j] = v1[i];
            w[j+1] = v2[i];
            j++;
            j++;
        }
    
    
        for(i=0; i<(n*2); i++){
            printf("\t%c", w[i]);
        }
    
    
        // Fine programma
        printf("\n\n\n----------------------------------------------------");
        return 0;
    }
    Ultima modifica di MItaly; 26-10-2014 a 16:15 Motivo: Aggiunti tag CODE
    METAL IS MY WAY FOREVER

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prima di usare j devi azzerarlo.

    j=0;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Prima di usare j devi azzerarlo.

    j=0;
    Grazie! Sono veramente sbadato, così funziona perfettamente! Ma per la cosa del fflush? Ci sono metodi più ortodossi per cancellare il buffer di lettura?
    METAL IS MY WAY FOREVER

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Di questo problema ce ne siamo occupati moltissime volte nel forum ... se fai una ricerca troverai come usare una while al posto del fflush
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Di questo problema ce ne siamo occupati moltissime volte nel forum ... se fai una ricerca troverai come usare una while al posto del fflush
    Mmmm ho cercato all'interno del forum ma non è che abbia trovato molto! Non riusciresti a darmi una soluzione qui (non credo sia lunghissima), o indirizzarmi ad un link? Grazie in anticipo!
    METAL IS MY WAY FOREVER

  6. #6
    Il comportamento di fflush(stdin) non è definito dallo standard. Praticamente nessuna combinazione di compilatore e SO la supporta, se si parla di mainstream.
    L'idioma più standard e portabile è il seguente, fornito in via del tutto eccezionale, poiché trattasi davvero di una FAQ che ricorre centinaia di volte su ogni forum, incluso il presente:

    codice:
    void kbd_clean(void)
    {
        register char ch;
        do 
        {
            ch = getchar();
        } while (('\n' != ch) && (EOF != ch));
        /* 
        ** Alternativamente, piu' in sintesi: 
        ** while ((ch = getchar() != '\n') && (ch != EOF));
        */
    }
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Il comportamento di fflush(stdin) non è definito dallo standard. Praticamente nessuna combinazione di compilatore e SO la supporta, se si parla di mainstream.
    L'idioma più standard e portabile è il seguente, fornito in via del tutto eccezionale, poiché trattasi davvero di una FAQ che ricorre centinaia di volte su ogni forum, incluso il presente:

    codice:
    void kbd_clean(void)
    {
        register char ch;
        do 
        {
            ch = getchar();
        } while (('\n' != ch) && (EOF != ch));
        /* 
        ** Alternativamente, piu' in sintesi: 
        ** while ((ch = getchar() != '\n') && (ch != EOF));
        */
    }
    Cioè ogni volta che richiedo un carattere in entrata, lo metto nel do while come hai detto?
    Non so cosa siano void, kbd_clean ed EOF, ma suppongo di potermene disinteressare per il momento, finche non li vedrò nel,libro.
    Il mio libro peraltro suggerisce di usare scanf("%c", &pausa), dove pausa è una variabile ausiliaria, ma non fa mai esempi a riguardo.
    Ho provato a metterlo dopo ogni scanf vero e ottengo strani risultati.

    Grazie per la pazienza!
    METAL IS MY WAY FOREVER

  8. #8
    Caro guerriero del metallo, quel che devi fare è richiamare la funzione kbd_clean() definita esattamente come sopra, ovviamente fuori dal main(), ogni volta che useresti la fflush(stdin) (che, ripeto, non funziona).
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.