Guida C: Capitolo 5/b

7 03 2010

#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.

­#include <stdio.h>
main()
{
char vett[10];
char a;
int i=0;
while (i<10)
{
printf (“inserisci carattere\n”);
while ( (a=getchar())!= ‘\n’ )
{
vett[i]=a;
}
i++;
}
i=0;
while(i<10)
{
printf (“%c\n”, vett[i]);
i++;
}
}

Acquisizione di caratteri in un vettore.


Azioni

Informazione

5 risposte

7 03 2010
damage92

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?

7 03 2010
francesco

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.

7 03 2010
damage92

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

8 03 2010
francesco

Sto cercando di capirlo, però posso dire che la soluzione proposta qui sopra secondo me è sicura.
Non affidiamo la nostra vita a uno spazio :-)

8 03 2010
francesco

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.

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s




Follow

Get every new post delivered to your Inbox.