[C] Acquisizione char da tastiera

di Anonimizzato21872 il
21 risposte
Ciao a tutti, come mai non riesco ad acquisire Char da tastiera per fare una semplice domanda al utente del tipo Y o N? Mi date un occhiata a questo codice? Grazie a tutti

#include<stdio.h>
int main(){
int vet[100];
int temp;
int i=0;
int n;
char risposta;

do{
printf("inserisci un numero\n");
scanf("%d",&vet);
printf("vuoi inserire un altro valore?(Y/N)\n");
scanf("%d",&risposta);
n=n+1;
i++;
}
while(risposta=='Y');
}

21 Risposte

  • Ti semplicemente segnalo che tentando di compilare il tuo codice, ottengo il seguente avviso:

    " warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
    scanf("%d",&risposta);
    "
  • Devi inserire "%c" per un carattere oppure "%s" intesa come stringa!!
  • vuott ha scritto:


    Ti semplicemente segnalo che tentando di compilare il tuo codice, ottengo il seguente avviso:

    " warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
    scanf("%d",&risposta);
    "
    Ragazzi scusate rispondo ad entrambi in maniera uguale. Quello è un refuso di un copia e incolla poiché per risolvere il problema avevo fatto una versione dove avevo sostituito i char con gli int in modo che invece di aspettarsi un Y o un N si aspettava un 1 o uno 0. Me ne sarei accorto se dava errore il compilatore quello che mi fa invece il programma (con c al posto di d) è che mi printeffa (scusate il termine) la domanda se voglio aggiungere un altro numero, ma non accetta risposte non uscendomi più dal programma (penso a causa del while). Potete ricontrollare? Grazie mille
  • AmedeoF ha scritto:


    Devi inserire "%c" per un carattere oppure "%s" intesa come stringa!!
    Ragazzi scusate rispondo ad entrambi in maniera uguale. Quello è un refuso di un copia e incolla poiché per risolvere il problema avevo fatto una versione dove avevo sostituito i char con gli int in modo che invece di aspettarsi un Y o un N si aspettava un 1 o uno 0. Me ne sarei accorto se dava errore il compilatore quello che mi fa invece il programma (con c al posto di d) è che mi printeffa (scusate il termine) la domanda se voglio aggiungere un altro numero, ma non accetta risposte non uscendomi più dal programma (penso a causa del while). Potete ricontrollare? Grazie mille
  • Il problema non è il while ma la scanf, ti consiglio di eseguire il debug perché può farti capire molte cose.
  • Tonmu ha scritto:


    Il problema non è il while ma la scanf, ti consiglio di eseguire il debug perché può farti capire molte cose.
    Grazie ma potresti dirmi qualcosa di più perché non posso lavorare sempre ad il computer con il quale programmo..
  • Dopo aver inserito il numero nel vettore rimane il carattere di new line nel buffer (cioè "\n") quindi la scanf del char prende \n. Per risolvere il problema devi modificare la scanf così: scanf(" %c",&risposta); ovvero uno spazio prima del %c, così facendo la scanf ignora i caratteri blank.
  • Zio_petrullone ha scritto:


    perché non posso lavorare sempre ad il computer con il quale programmo..
    Che vuoi dire?
  • Tonmu ha scritto:


    Dopo aver inserito il numero nel vettore rimane il carattere di new line nel buffer (cioè "\n") quindi la scanf del char prende \n. Per risolvere il problema devi modificare la scanf così: scanf(" %c",&risposta); ovvero uno spazio prima del %c, così facendo la scanf ignora i caratteri blank.
    Grazie mille ora funziona
  • Ho letto la discussione. Seguendo le istruzioni date, il risultato non mi è piaciuto.
    Ho modificato il codice in questo modo:
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main()
    {
    int vet[10];
    int temp;
    int i=0;
    int n=0;
    char risposta;
    
    	printf("vuoi inserire un numero ? (y/n)\n");
    	scanf(" %c",&risposta);
    	if(risposta=='y')
    	{
    		printf("quanti numeri vuoi inserire ? ");
    		scanf("%d",&n);
    		while(risposta == 'y' && vet[i] < vet[n])
    		{
    			for(i=0; i<n; i++)
    			{
    				printf("inserisci un numero:  \n");
    				scanf("%d",&vet[n]);
    			}
    		}
    	}
    	else
    		return 0;
    }
    
    Funziona bene.
    Saluti.
  • Funziona bene.
    L'hai provato e funziona ???
    Tralasciando il fatto che testi solo la 'y' e non la 'Y' (peccato veniale ) potresti spiegare cosa fa il test qui sotto?
    while (risposta == 'y' && vet[i] < vet[n])
    visto che 'risposta' non può cambiare all'interno del ciclo e che vet[] non è ancora stato caricato (ma al di là di queste considerazioni, davvero non si capisce il test che fai).
    Infine: hai ridotto la dimensione di vet[] da 100 (come era nel posto originale) a 10: perchè? Perchè invece non hai inserito un controllo sull'input di n (ovvero che sia 0<n<=10)?
    Dimenticavo... qui sotto c'è un errore bello grosso (vet[n] anzichè vet)
    			for (i = 0; i<n; i++)
    			{
    				printf("inserisci un numero:  \n");
    				scanf("%d", &vet[n]);
    			}
    
  • candaluar ha scritto:


    Funziona bene.
    L'hai provato e funziona ???
    Tralasciando il fatto che testi solo la 'y' e non la 'Y' (peccato veniale ) potresti spiegare cosa fa il test qui sotto?
    while (risposta == 'y' && vet[i] < vet[n])
    visto che 'risposta' non può cambiare all'interno del ciclo e che vet[] non è ancora stato caricato (ma al di là di queste considerazioni, davvero non si capisce il test che fai).
    Infine: hai ridotto la dimensione di vet[] da 100 (come era nel posto originale) a 10: perchè? Perchè invece non hai inserito un controllo sull'input di n (ovvero che sia 0<n<=10)?
    Dimenticavo... qui sotto c'è un errore bello grosso (vet[n] anzichè vet)
    			for (i = 0; i<n; i++)
    			{
    				printf("inserisci un numero:  \n");
    				scanf("%d", &vet[n]);
    			}
    
    Ho snellito il mio codice togliendo il while, ed aggiustando lo scanf.
    Comunque, l'utente che ha aperto la discussione, chiedeva qualcosa di diverso. Infatti aveva usato il do...while.
    Ora ci studio un pò, e poi posto il codice completo, che tenga conto di un primo inserimento di un numero e poi la domanda se si vuole aggiungere altri numeri.
  • Comunque, l'utente che ha aperto la discussione, chiedeva qualcosa di diverso. Infatti aveva usato il do...while.
    In realtà Zio_petrullone aveva anche chiuso la discussione, mi sembra; credo che non ci sia niente di sbagliato ad aggiungere delle precisazioni, come credo volessi fare tu , ma confondere le idee proponendo come soluzione alternativa del codice che non funziona non mi sembra per niente una buona idea. Se devi postare del codice almeno provalo
  • candaluar ha scritto:


    Comunque, l'utente che ha aperto la discussione, chiedeva qualcosa di diverso. Infatti aveva usato il do...while.
    In realtà Zio_petrullone aveva anche chiuso la discussione, mi sembra; credo che non ci sia niente di sbagliato ad aggiungere delle precisazioni, come credo volessi fare tu , ma confondere le idee proponendo come soluzione alternativa del codice che non funziona non mi sembra per niente una buona idea. Se devi postare del codice almeno provalo
    Da quello che ho capito dell'idea dell'utente starter, ho riveduto e corretto il mio codice.
    Oltre il codice c'è anche il commento.
    
    // DICHIARO LE LIBRERIE
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main()
    {
    // DICHIARO ED INIZIALIZZO LE VARIABILI
    int vet[100];
    int i=0;
    int n=0;
    char risposta;
    	// SI INSERISCE IL PRIMO NUMERO
    	printf("inserisci un numero\n");
    	scanf("%d",&vet[i]);
    	// SI CHIEDE ALL'UTENTE SE VUOLE INSERIRE ALTRI VALORI
    	printf("vuoi inserire altri valori ? (y/n)\n");
    	scanf(" %c",&risposta);
    	// CON if, SE LA RISPOSTA E' y SI PROSEGUE CON IL PROGRAMMA
    	if(risposta == 'y')
    	{	// SI CHIEDE QUANTI NUMERI SI VOGLIONO INSERIRE
    		printf("quanti numeri vuoi inserire ?  ");
    		scanf("%d", &n);
    			// CON IL CICLO FOR SI INSERISCONO NEL vet[i] I NUMERI VOLUTI
    			for(i=0; i<n; i++)
    			{
    				printf("inserisci un numero \n");
    				scanf("%d",&vet[i]);
    			}
    	}
    	else
    	{return 0;}	// ALTRIMENTI SI ESCE DAL PROGRAMMA
    }
    
Devi accedere o registrarti per scrivere nel forum
21 risposte