PDA

Visualizza la versione completa : [C] Inserire ricorsivamente caratteri in un array


Ensiferum
26-10-2014, 14:05
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 :D

Grazie in anticipo!

P.S.: Uso Code::Blocks

Allego qui il mio 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;
}

oregon
26-10-2014, 14:36
Prima di usare j devi azzerarlo.

j=0;

Ensiferum
26-10-2014, 14:42
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?

oregon
26-10-2014, 14:57
Di questo problema ce ne siamo occupati moltissime volte nel forum ... se fai una ricerca troverai come usare una while al posto del fflush

Ensiferum
26-10-2014, 15:30
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!

M.A.W. 1968
26-10-2014, 15:50
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:



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));
*/
}

Ensiferum
26-10-2014, 16:06
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:



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!

M.A.W. 1968
26-10-2014, 16:23
Caro guerriero del metallo (https://www.youtube.com/watch?v=Q8PMccq6VZw), 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).

Loading