Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzionamento parzialmente incorretto di
Forum - C/C++ - Funzionamento parzialmente incorretto di

Avatar
stichtom (Member)
Newbie


Messaggi: 4
Iscritto: 21/10/2012

Segnala al moderatore
Postato alle 21:41
Giovedì, 09/10/2014
Ciao a tutti, sto cercando di realizzare un controllo sul dato inserito dall'utente, ma sto incontrando parecchie difficoltà. In particolare il numero inserito deve essere positivo e un intero.
Il codice che ho scritto funziona correttamente se inserisco un numero negativo, ma quando inserisco un carattere (tipo una lettera) o un numero con la virgola, il programma funziona stranamente: nel caso di un carattere incomincia un ciclo infinito in cui continua a ripetere il do while, mentre se inserisco un numero con la virgola, mi dice correttamente di inserire un nuovo valore, ma poi esce immediatamente dal programma senza farmelo inserire nuovamente.

Qualcuno mi sa dire dove ho sbagliato? Grazie
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  
  6.     int n,check;
  7.     char c;
  8.        
  9.                 do {
  10.                         printf("Inserisci un intero positivo: ");
  11.                         check = scanf("%d%c",&n,&c);
  12.                 } while (check != 2 || c!= '\n' || n<0);
  13.  
  14.     return 0;
  15.  
  16.  
  17. }


Ultima modifica effettuata da stichtom il 09/10/2014 alle 21:43
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:53
Giovedì, 09/10/2014
Per questo tipo di problemi devi evitare di usare la scanf.

Per l'input usa la fgets e inserisci tutto in una stringa (un array di char abbastanza grande), poi controlla il contenuto della stringa e validalo secondo le tue esigenze.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
stichtom (Member)
Newbie


Messaggi: 4
Iscritto: 21/10/2012

Segnala al moderatore
Postato alle 1:32
Venerdì, 10/10/2014
Purtroppo non posso usare ancora array o cose ""avanzate"", ma devo limitarmi a cose abbastanza base. Comunque ho risolto inserendo un "fflush(stdin);" che invece, ironicamente, abbiamo già fatto. Purtroppo so che è una soluzione veramente non funzionale dato che è compatibile solo con Windows...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:55
Venerdì, 10/10/2014
Se inserisci una lettera con la scanf non credo che la fflush possa risolvere. Comunque, al posto della fflush puoi usare la linea

while(getchar() != '\n') ;


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
pbe (Normal User)
Pro


Messaggi: 131
Iscritto: 24/05/2014

Segnala al moderatore
Postato alle 19:28
Lunedì, 13/10/2014
Anchio ho lo stesso problema che ha avuto Stichtom, io applicando un codice quasi uguale al suo mi succedeva che se mettevo un carattere il programma andava in loop continuo senza potersi più fermare. Il codice stava in un do-while. Qualcuno mi può chiarire le idee?

PM Quote
Avatar
pbe (Normal User)
Pro


Messaggi: 131
Iscritto: 24/05/2014

Segnala al moderatore
Postato alle 15:10
Lunedì, 12/01/2015
Se interessa ancora ecco la soluzione che ho trovato:

Codice sorgente - presumibilmente C/C++

  1. int c;
  2.  
  3.                 printf ("Inserisci un numero intero : ");
  4.                 do
  5.                 {
  6.                         c = scanf("%d",&num[i]);
  7.                
  8.                         if (c == 0)
  9.                         {
  10.                                 scanf ("%*[^\n]");
  11.                                 printf ("\nAttenzione: input non valido.\n\nInserisci un numero intero : ");
  12.                         }
  13.                 }
  14.                 while(c == 0);



La riga "scanf ("%*[^\n]");" ha circa la stessa funzione del fflush()

Ultima modifica effettuata da pbe il 12/01/2015 alle 15:11
PM Quote
Avatar
orsobimbo (Normal User)
Newbie


Messaggi: 8
Iscritto: 27/12/2014

Segnala al moderatore
Postato alle 18:51
Lunedì, 12/01/2015
Ciao approfitto anche io per dire la mia :D

Dal testo si riassume :

- Accetta solo numeri con segno e positivi
- Senza utilizzare array

Non specifica se :

- Poter uscire dal programma tramite un tasto dedicato
- quanti dati deve accettare


Codice sorgente - presumibilmente C++

  1. // stichtom.cpp : definisce il punto di ingresso dell'applicazione console.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.  int n,c;
  9.  
  10.   do {
  11.         do
  12.         {
  13.            printf("Inserisci un intero positivo ( 0 per terminare): ");
  14.            scanf_s("%d",&n);
  15.                                                                
  16.         } while (n>0); // accetta tutti i numeri con segno e positivo
  17.  
  18.           while((c = getchar()) != '\n' ); //Pulisce il buffer
  19.                                        
  20.           if (n<0) printf("Hai inserito un umero con segno negativo non richiesto..\n"); //Quindi repete l'input
  21.                          
  22.        } while(n!=0); // continua fino alla pressione del tasto '0'
  23.                            
  24.          printf("Hai inserito il numero zero per terminare l'input\nPremi un tasto per continuare");
  25.                                                
  26.          getchar();
  27.  
  28.          return 0;
  29. }




Edit: l'ho testato prima di postarlo , ma all'ultimo è saltato fuori il problema del loop citato sopra :noway:


Ultima modifica effettuata da orsobimbo il 12/01/2015 alle 19:06
PM Quote
Avatar
orsobimbo (Normal User)
Newbie


Messaggi: 8
Iscritto: 27/12/2014

Segnala al moderatore
Postato alle 19:33
Lunedì, 12/01/2015
Testo quotato

Postato originariamente da pbe:

Se interessa ancora ecco la soluzione che ho trovato:

.........................
La riga "scanf ("%*[^\n]");" ha circa la stessa funzione del fflush()



Se ho capito bene non  con "^" esclude il newline

http://en.cppreference.com/w/cpp/io/c/fscanf

Ultima modifica effettuata da orsobimbo il 12/01/2015 alle 19:34
PM Quote
Avatar
pbe (Normal User)
Pro


Messaggi: 131
Iscritto: 24/05/2014

Segnala al moderatore
Postato alle 15:45
Martedì, 13/01/2015
Sì, esatto.

PM Quote