[C] Acquisizione char da tastiera

Forum di discussioni su C e C++

Moderatori: Toki, skynet

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
Zio_petrullone
Utente Junior
Messaggi: 23
Iscritto il: 13 lug 2017, 19:02

[C] Acquisizione char da tastiera

Messaggioda Zio_petrullone » 02 ago 2017, 21:57

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[i]);
printf("vuoi inserire un altro valore?(Y/N)\n");
scanf("%d",&risposta);
n=n+1;
i++;
}
while(risposta=='Y');
}

f18
vuott
Utente Junior
Messaggi: 95
Iscritto il: 06 giu 2014, 15:14

Re: [C] Acquisizione char da tastiera

Messaggioda vuott » 02 ago 2017, 22:10

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);
"
AmedeoF
New Entry
Messaggi: 11
Iscritto il: 14 giu 2017, 14:30

Re: [C] Acquisizione char da tastiera

Messaggioda AmedeoF » 03 ago 2017, 09:08

Devi inserire "%c" per un carattere oppure "%s" intesa come stringa!! :D
Zio_petrullone
Utente Junior
Messaggi: 23
Iscritto il: 13 lug 2017, 19:02

Re: [C] Acquisizione char da tastiera

Messaggioda Zio_petrullone » 03 ago 2017, 14:39

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 :P 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 :)
Zio_petrullone
Utente Junior
Messaggi: 23
Iscritto il: 13 lug 2017, 19:02

Re: [C] Acquisizione char da tastiera

Messaggioda Zio_petrullone » 03 ago 2017, 14:39

AmedeoF ha scritto:Devi inserire "%c" per un carattere oppure "%s" intesa come stringa!! :D


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 :P 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 :)
Tonmu
Utente Junior
Messaggi: 41
Iscritto il: 10 lug 2017, 12:56

Re: [C] Acquisizione char da tastiera

Messaggioda Tonmu » 03 ago 2017, 15:31

Il problema non è il while ma la scanf, ti consiglio di eseguire il debug perché può farti capire molte cose.
Zio_petrullone
Utente Junior
Messaggi: 23
Iscritto il: 13 lug 2017, 19:02

Re: [C] Acquisizione char da tastiera

Messaggioda Zio_petrullone » 03 ago 2017, 16:59

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.. :)
Tonmu
Utente Junior
Messaggi: 41
Iscritto il: 10 lug 2017, 12:56

Re: [C] Acquisizione char da tastiera

Messaggioda Tonmu » 03 ago 2017, 17:12

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.
oregon
Utente Senior
Messaggi: 9438
Iscritto il: 20 nov 2011, 18:54
Località: Roma

Re: [C] Acquisizione char da tastiera

Messaggioda oregon » 03 ago 2017, 18:54

Zio_petrullone ha scritto: perché non posso lavorare sempre ad il computer con il quale programmo.. :)


Che vuoi dire?
___________________
"Il gioco del Lotto : la tassa sull'imbecillità". (Bruno De Finetti, grande matematico italiano)
Zio_petrullone
Utente Junior
Messaggi: 23
Iscritto il: 13 lug 2017, 19:02

Re: [C] Acquisizione char da tastiera

Messaggioda Zio_petrullone » 04 ago 2017, 16:29

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 ;) f28
ProgrammD
Utente Senior
Messaggi: 205
Iscritto il: 27 ott 2015, 11:03

Re: [C] Acquisizione char da tastiera

Messaggioda ProgrammD » 11 ago 2017, 10:23

Ho letto la discussione. Seguendo le istruzioni date, il risultato non mi è piaciuto.
Ho modificato il codice in questo modo:

Codice: Seleziona tutto

#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.
candaluar
Utente Senior
Messaggi: 1493
Iscritto il: 21 ago 2013, 09:53

Re: [C] Acquisizione char da tastiera

Messaggioda candaluar » 11 ago 2017, 11:02

Funziona bene.
L'hai provato e funziona f16 f16 f16 ???
Tralasciando il fatto che testi solo la 'y' e non la 'Y' (peccato veniale f12 ) potresti spiegare cosa fa il test qui sotto?

Codice: Seleziona tutto

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[i])

Codice: Seleziona tutto

         for (i = 0; i<n; i++)
         {
            printf("inserisci un numero:  \n");
            scanf("%d", &vet[n]);
         }
ProgrammD
Utente Senior
Messaggi: 205
Iscritto il: 27 ott 2015, 11:03

Re: [C] Acquisizione char da tastiera

Messaggioda ProgrammD » 11 ago 2017, 12:17

candaluar ha scritto:
Funziona bene.
L'hai provato e funziona f16 f16 f16 ???
Tralasciando il fatto che testi solo la 'y' e non la 'Y' (peccato veniale f12 ) potresti spiegare cosa fa il test qui sotto?

Codice: Seleziona tutto

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[i])

Codice: Seleziona tutto

         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.
candaluar
Utente Senior
Messaggi: 1493
Iscritto il: 21 ago 2013, 09:53

Re: [C] Acquisizione char da tastiera

Messaggioda candaluar » 11 ago 2017, 13:23

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 :wink: , 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 f11
ProgrammD
Utente Senior
Messaggi: 205
Iscritto il: 27 ott 2015, 11:03

Re: [C] Acquisizione char da tastiera

Messaggioda ProgrammD » 11 ago 2017, 13:48

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 :wink: , 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 f11


Da quello che ho capito dell'idea dell'utente starter, ho riveduto e corretto il mio codice.
Oltre il codice c'è anche il commento.

Codice: Seleziona tutto

// 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
}

Torna a “C/C++”

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti