Newsgroup: it.comp.lang.c
Titolo: Problema con scanf

Ecco  il problema:
devo creare un algoritmo che crea una lista ordinata di numeri interi letti
da tastiera.La funzione che ho scritto(ricorsiva) è la seguente:
-----------------------------------------------------
void CreaLista(LISTA *L){
     int el;
     printf("Scrivere il numero da inserire nella lista\n");
     if(scanf("%d",&el)!=-1){
       InsInOrd(L,el);
       CreaLista(L);
     }
}
-----------------------------------------------------
dove InsInOrd è una funzione che inserisce el nella lista L  in modo
ordinato(crescente).
Il mio docente mi ha detto di mettere quel tipo di controllo sullo scanf di
modo
che,per far terminare la ricorsione,bastava premere ctrl+z al momento di
immettere il numero da tastiera.In quel modo scanf sarebbe stato uguale a -1
e di conseguenza non si rientrava nell'if.
Purtoppo quanto appena detto non funziona.Nel senso che al momento di
immettere la prima parola da tastiera il dos segnala un errore.
Qualcuno saprebbe dirmi come cambiare il controllo sullo scanf di modo che
la condizione effettivamente non è verificata premendo ctrl+z?Per quanto
riguarda il resto credo sia fatto bene.
Uso Win98 come SO e DevCpp 4.01 come compilatore.
Grazie


Hai provato a mettere il controllo >0 invece che !=-1?
Hai provato a digitare qualcos'altro invece che ctrl+z (tipo ctrl+d)?
Sono tentativi, sia chiaro, non ho ben chiaro il problema.
Ciao
Ema

 "parola" o numero?
numero scusami.

 
puoi dirmi il tipo di errore che ti segnala xche' ho provato a riprodurre 
il tutto sul devcpp 4 sotto win98 e funge (cioe' col ctrl+z non passa x 
l'if) :| prova al max a sostituire quel -1 con un EOF.
Luca
-- 
....~.......xin\@IRCNet (mostly xin\aWAy 24/7 ghgh).../"\
.../V\......Email: xi...@despammed.com................\ /
..// \\.....ICQ UIN: 63088554..........................\
./(   )\........................ASCII Ribbon Campaign./ \
..^`~'^.........................Against HTML Mail and News

 --
mi dice il programma ha eseguito un'operazione non valida etc.Idettagli dell
errore sono i seguenti:
UNISCILISTE ha provocato un errore di stack nel modulo MSVCRT.DLL in
019f:7800cc34.
Registri:
EAX=00010000 CS=019f EIP=7800cc34 EFLGS=00010206
EBX=02560290 SS=01a7 ESP=00542000 EBP=0054201c
ECX=04260000 DS=01a7 ESI=04880000 FS=4b77
EDX=04260000 ES=01a7 EDI=0255f178 GS=0000
Byte all'indirizzo CS:EIP:
50 56 89 45 f8 ff 15 ac 30 03 78 3b c6 0f 85 89
Immagine dello stack:
00001000 00000004 00000000 00000020 00530000 0255f164 00000010 00542054
7800b41c 00000002 00000000 817a1bc0 00530000 7803b128 00542074 7800b449
Non so di preciso cosa significhino.In ogni caso ho provato a cambiare
scrivendo if (scanf("%s",elem)!=EOF) ma dà lo stesso errore.


Qui la cosa si fa sospetta...
"if (scanf("%s",elem)!=EOF) "
oppure
if (scanf("%d",&elem)!=EOF)
com'e' dichiarato elem?
Ciao,
Ema


elem è una 
stringa.in
 ogni caso ho corretto l'errore banale(ho aggiunto &)
ma il risultato è lo stesso.

 
prova a fare prima scanf e poi a dare la variabile int in pasto all'if boh 
cmq il dev da un bel po' di problemi (tipo un sorgente compilato 
perfettamente con gcc e con dev4 funge ovunque mentre invece con le ver 
successive mi overflowa bah :|)


 ha scritto nel messaggio
news:3YrGa.169653$g92.3...@news2.tin.it...

Ma io non capisco, all'inizio del thread dicevi di voler leggere una lista
di interi...
Vabbe', se leggi delle stringhe allora devi dichiarare elem come tale
allocandogli abbastanza memoria e poi usare scanf senza &.
Quindi:
char elem[MAX_LUNG_STRING];
...
if(scanf("%s",elem) != EOF)
se hai ancora problemi posta un _breve_ programmino completo che produca il
malfunzionamento di cui ti lamenti, cosi' possiamo studiarlo in locale.
Ciao,
Ema
--- tanto per completezza
se tu leggessi interi sarebbe stato
int elem;
...
if(scanf("%d",&int) > 0)
metterei > 0 perche' anche 0 e' un valore di ritorno erroneo per la lettura
di numeri (nel caso in cui l'utente faccia il furbino e inserisca delle
lettere invece che delle cifre)
---

 malfunzionamento di cui ti lamenti, cosi' possiamo studiarlo in locale.
Grazie  ema sono riuscito a risolvere il problema mettendo come controllo
 if(scanf("%s",elem)>0) nonostante stessi lavorando con le stringhe.


Era uno dei tentativi che gia' proposi nella prima risposta che avevo
postato... forse non ti fidavi? -___^
Ok, ben lieto che tu abbia risolto.
Ciao
Ema