#include <stdio.h>
main()
{
char a;
int i=0;
while (i<8)
{
printf (“inserisci carattere\n”);
while ( (a=getchar())!= ‘\n’ )
{
printf (“%c\n”, a);
}
i++;
}
}
Il codice di cui sopra contiene due cicli while annidati.
Il primo serve a ripetere il ciclo 8 volte.
Il secondo serve ad acquisire un carattere.
Come vedete, l’acquisizione avviene direttamente nelle condizioni del ciclo.
Ho scelto di usare getchar() perchè restituisce direttamente il valore acquisito mettendolo nella variabile, mentre con scanf() primo si acquisisce un valore, che poi viene messo tramite un puntatore nella variabile.
In questo modo posso inserire la condizione != ‘\n’. Infatti quando si acquisisce un carattere con scanf o getchar, il programma acquisisce anche il valore passato dalla pressione del tasto invio. E’ per questo che nell’esercizio precedente il ciclo “saltava” un passaggio ad ogni ripetizione.
Questo non avviene con le variabili numeriche.
Acquisizione di caratteri in un vettore.







Per risolvere il “problema” dell’invio si potrebbe anche fare così:
#include
int main()
{
char a[1];
int i;
for (i=1; i != 8; i++)
{
printf (“\ninsert char %d: “, i);
scanf(“%s”, a);
printf (“hai inserito: %c”, *a);
}
}
Cioè fai un array di 2 caratteri, in cui verranno scritti il carattere digitato e il carattere “\n”. A quel punto stampi solo il primo carattere.
Però il tuo codice è migliore nel caso che si scrivano più caratteri e poi invio, il mio prenderebbe solo il primo…
Ma perché invece con gli interi non prende il carattere invio?
La tua soluzione è però impropria, in quanto provochi uno “sfondamento”, cioè il programma cerca di inserire un elemento in più nel vettore a[ ].
Inoltre sottolineo che per fare un vettore di due elementi si fa “tipo vettore[2]“, che avrà gli elementi vettore[0] e vettore[1]. Con la tua notazione crei un vettore unario.
Inoltre ho scoperto una cosa che mi lascia perplesso
#include
void main()
{
int i, j, k;
char temp;
char array[50];
i=0;
while (i<50)
{
scanf (" %c", &temp);
printf ("%d", i);
array[i]=temp;
i++;
}}
In questo codice ho lasciato uno spazio prima di %c nello scanf, e non mi da il problema dell'acquisizione dell'invio. Non mi ricordavo di questa particolarità, e non so spiegarla.
Uao, questa dello spazio è di certo la soluzione migliore!
Hai ragione, doveva essere un “char a[2]“, e non ho pensato al buffer overflow nel caso si inserisca più di un carattere x_x
La pagina man di scanf dice che il primo parametro è il formato dell’input. Cioè dovremmo scrivere “%c\n”! Ma facendo così non funziona, prende i carattere in ritardo di uno
Mentre senza \n mette l’invio nella variabile del ciclo dopo -.-
Chissà perché con lo spazio funziona O.o
Sto cercando di capirlo, però posso dire che la soluzione proposta qui sopra secondo me è sicura.
Non affidiamo la nostra vita a uno spazio
Allora, secondo quanto ho capito:
la scanf quando incontra uno spazio, ignora tutti gli spazi successivi, compresi quindi anche gli acapo, fino a quando non trova un altro vero e proprio spazio. Si può dire che è uno stratagemma.
Però ho chiesto in giro, e la soluzione con getchar nel while è considerata migliore.