Input in C

n.icola114
Ciao,
forse mi sfugge qualcosa di banale ma ho un problema con la lettura di un dato da tastiera

int dato;

scanf("%d", &dato);

per quale motivo il dato non viene letto ?

Risposte
enigmagame
"n.icola":

per quale motivo il dato non viene letto ?

In che senso non viene letto?

n.icola114
La scanf mi restituisce EOF e non ne capisco il motivo

enigmagame
"n.icola":
La scanf mi restituisce EOF e non ne capisco il motivo

Come contenuto di "dato"? O come valore di ritorno? Comunque è strano perchè è corretta...
Ora devo scappare, se hai la possibilità prova a fare il debug per vedere cosa combina...

n.icola114
Si, il valore restituito da quell'espressione li è EOF, dato non viene toccato e perciò pensavo fosse dovuto a qualcosa rimasto nello stdin
quindi ho cercato un pò e ho trovato la fflush() ma il risultato non cambia

ciao e grazie lo stesso

enigmagame
Sei riuscito a risolvere?
Ma questo problema te lo fa in un "grosso" programma oppure anche in due righe di codice? Cioè se il programma è questo:
#include <stdio.h>

int dato;

int main()
{
	printf("%d", scanf("%d", &dato));
	printf("%d", dato);
}

Ti da lo stesso problema?

*Anony_1
Fonamentalmente il problema è il seguente:

scanf prende l'intero digitato, ma in questo programma non viene digitato niente.

#include <stdio.h>

main()
{
   
   int dato;

   printf("digita l'intero e premi enter");
   scanf("%d", &dato);
   printf("hai digitato: %d", dato);

}

enigmagame
"Anony_":
Fonamentalmente il problema è il seguente:

scanf prende l'intero digitato, ma in questo programma non viene digitato niente.

#include <stdio.h>

main()
{
   
   int dato;

   printf("digita l'intero e premi enter");
   scanf("%d", &dato);
   printf("hai digitato: %d", dato);

}

:shock: Scusa? Non capisco cosa stai dicendo...

*Anony_1
sorry, ho capito male il suo problema...

vict85
"Anony_":
Fonamentalmente il problema è il seguente:

scanf prende l'intero digitato, ma in questo programma non viene digitato niente.

#include <stdio.h>

main()
{
   
   int dato;

   printf("digita l'intero e premi enter");
   scanf("%d", &dato);
   printf("hai digitato: %d", dato);

}


Ma ti da EOF nel senso che ti chiude la finestra perché in tal caso il problema non sta nello scanf ma nel fatto che non hai bloccato il programma dandoti il tempo di leggere ed è finito.
Comunque metti anche qualche '\n' per impaginare meglio i risultati. un int prima del main e un return 0 alla fine.

n.icola114
"vict85":
[quote="Anony_"]Fonamentalmente il problema è il seguente:

scanf prende l'intero digitato, ma in questo programma non viene digitato niente.

#include <stdio.h>

main()
{
   
   int dato;

   printf("digita l'intero e premi enter");
   scanf("%d", &dato);
   printf("hai digitato: %d", dato);

}


Ma ti da EOF nel senso che ti chiude la finestra perché in tal caso il problema non sta nello scanf ma nel fatto che non hai bloccato il programma dandoti il tempo di leggere ed è finito.
Comunque metti anche qualche '\n' per impaginare meglio i risultati. un int prima del main e un return 0 alla fine.[/quote]

No, quello è solo un esempio postato per capire quale fosse il problema,
non so per quale motivo ma credo che il compilatore stia facendo i capricci.
Forse la dico grossa ma è possibile che la scanf mi restituisce EOF perchè i due stream principali, stdin e stdout, sono chiusi ?

enigmagame
"n.icola":

No, quello è solo un esempio postato per capire quale fosse il problema,
non so per quale motivo ma credo che il compilatore stia facendo i capricci.
Forse la dico grossa ma è possibile che la scanf mi restituisce EOF perchè i due stream principali, stdin e stdout, sono chiusi ?

Bè a meno che non venga chiuso dal programma stesso non credo, certo che se fosse chiuso non riusciresti di sicuro a leggere nulla. Però non capisco come possa essere chiuso...
Vediamo qualcos'altro, che sistema operativo e compilatore stai usando?
Altra cosa, se ad esempio usi la funzione getc() o getchar() cosa succede?

n.icola114
"enigmagame":

Vediamo qualcos'altro, che sistema operativo e compilatore stai usando?
Altra cosa, se ad esempio usi la funzione getc() o getchar() cosa succede?


Windows xp, come compilatore Borland turbo - C v 2.01, la getc() non l'ho mai usata ma la getchar() da lo stesso problema della scanf(),
ne sono più che sicuro, non so per quale motivo ma lo stdout sembra essere chiuso infatti il programma è ormai ridotto all'osso

#include<stdio.h>

main()
{
   int dato;
   
   scanf("%d", &dato);
}


e se provo a salvare lo stesso codice come nuovo file e compilarlo, stranamente il tutto funziona :shock:

grazie di tutto lo stesso,
ultimamente sto giocando con il visual C++ express, l'ho scoperto grazie a te,
e anche se è pieno di roba che probabilmente non utilizzerò mai trovo comode alcune possibilità come quella di visualizzare un'intera lista o strutture simili
piuttosto di saltare di nodo in nodo

ciao

Il_Conte_Pasticcere
Forse la dico grossa ma è possibile che la scanf mi restituisce EOF perchè i due stream principali, stdin e stdout, sono chiusi ?

Beh.. si :D

scanf è di fatto un alias a fscanf(stdin, ...) - legge i dati da stdin, immagino che se stdin è chiuso, per forza ritorni sempre EOF.
Leggi il man a: http://www.manpagez.com/man/3/scanf/

Quindi posso immaginare (ma potrei sbagliare) che tu abbia bisogno di:
- o redirigere stdin da qualche parte prima di chiudere l'originale (ti consiglio di leggere il man di "dup2()" e "pipe()" )
- o usare fscanf e dirgli da quale stream deve leggere

Ciao!
Fabio

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.