Newsgroup: it.comp.lang.c
Titolo: Non mi funziona...

Ho scritto questo "programma", ma all'esecuzione mi da errori che non
capisco!
Al primo inserimento accetta il valore.
Il secondo inserimento me lo salta per andare subito al terzo... non
capisco...
Qualcuno mi aiuti...please!
Il programma:
#include <stdio.h>
void main()
{
 char l1, l2, l3;
 l1 = 0;
 l2 = 0;
 l3 = 0;
 printf("Inserire la 1??' lettera: ");
 scanf("%c", &l1);
 printf("\nInserire la 2??' lettera: ");
 scanf("%c", &l2);
 printf("\nInserire la 3??' lettera: ");
 scanf("%c", &l3);
 if (l1<l2)
 {
  if (l2<l3)
   printf("L'ordine delle lettere e': %c, %c, %c. \n", l1, l2, l3);
  else if (l3<l2)
   printf("L'ordine delle lettere e': %c, %c, %c. \n", l3, l1, l2);
 if (l2<l1)
  if (l1<l3)
   printf("L'ordine delle lettere e': %c, %c, %c. \n", l2, l1, l3);
  else if (l3<l2)
   printf("L'ordine delle lettere e': %c, %c, %c. \n", l3, l2, l1);
 if (l2<l3)
 {
  if (l3<l1)
   printf("L'ordine delle lettere e': %c, %c, %c. \n", l2, l3, l1);
 }
  else if (l1<l3)
    if (l3<l2)
     printf("L'ordine delle lettere e': %c, %c, %c. \n", l1, l3, l2);
 }
 else if (l1==l2==l3)
    printf("Le tre lettere sono uguali!\n");
   else printf("...C'e' qualcosa che non va...\n");
}
Per favore rispondetemi all'e-mail: 
neura...@dada.it
Grazie!

void main()
^^^ č errato : si usa 
int main()
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

  scanf("%c", &l3);
Basta inserire fflush(stdin); dopo ogni scanf, perchè ne buffer rimangono
delle informazioni (in questo caso il valore ASCII 10 che equivale a nuova
linea) che vengono poi intercettate dala secondo scanf.
Un modo più efficente sarebbe lo scrivere:
Printf ("inserire lettere 1,2,3 ");
scanf("%c %c %c", &l1 ,&l2 ,&l3);
basterebbe separare le lettere con uno spazio o con invio, scanf
aspetterebbe comunque l'immissione di 3 caratteri, un eventuale 4 carattere
verrebbe ignorato.
--
Marco @Madarco
mad...@hotmail.com
 &&§$$§&
&|@  @|#&
 '[   /  , ]## <- Io
  | °---> |#&
  \_, _/&&'

verrebbe ignorato.
E se invece non mettessi lo spazio tra una lettere e l'altra? Credo
che non cambierebe niente, tranne il fatto che tu crederesti magari di
inserire una stringa, mentre inserisci tre caratteri che vengono
assegnati a variabili diverse.
Paolo

 Basta inserire fflush(stdin); dopo ogni scanf,
Scusa se ribadisco nuovamente che fflush(stdin) non è utilizzabile a
norma di standard. Meglio
while ( getchar() != '\n' );
anche se pare non totalmente portabile.
EMG

 wrote:
[ snip ]
ND> scanf("%c", &l1);
ND> printf("\nInserire la 2??' lettera: ");
ND> scanf("%c", &l2);
ND> printf("\nInserire la 3??' lettera: ");
ND> scanf("%c", &l3);
Fermo restando che, come ti e' gia stato segnalato, la scanf() non e' il
massimo, puoi usare
scanf(" %c", &variabile);
lo spazio (o altro whitespace) indica alla scanf() di leggere e scartare
gli eventuali whitespace.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Grazie.
E se usassi qualcosa del tipo:
scanf(...)
clear_stdin()
void clear_stdin(void)
{
    char bo[80];
    gets(bo);
}
Andrebbe bene?
grazie.


anche se pare non totalmente portabile.
Perche' non portabile ?
La sequenza '\n' viene tradotta nei caratteri di "new line" in fase di
output e la stessa sequenza di caratteri viene ritradotta in '\n' in
fase di input.
Questa sequenza di escape serve proprio ad evitare problemi di
portabilità.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 Perche' non portabile ?
Leggi cosa dice qui:
12.26:  How can I flush pending input so that a user's typeahead isn't
        read at the next prompt?  Will fflush(stdin) work?
A:      fflush() is defined only for output streams.  Since its
        definition of "flush" is to complete the writing of buffered
        characters (not to discard them), discarding unread input would
        not be an analogous meaning for fflush on input streams.
        There is no standard way to discard unread characters from a
        stdio input stream, nor would such a way necessarily be
        sufficient, since unread characters can also accumulate in
        other, OS-level input buffers.  You may be able to read and
        discard characters until \n, or use the curses flushinp()
        function, or use some system-specific technique.  See also
        questions 19.1 and 19.2.
        References: ISO Sec. 7.9.5.2; H&S Sec. 15.2.
Praticamente afferma che non esiste un modo perfettamente portabile di
svuotare lo stream di input. Qualcuno tempo fa annotò in questo
newsgroup una possibile fonte di non portabilità nella tecnica di cui
sopra ma ora non riesco a ricordare quale fosse.
EMG

svuotare lo stream di input. 
A quanto pare la non portabilità è causata dal fatto che l'input
potrebbe essere "bufferizzato" a più livelli.
Io credevo che si alludesse alla non portabilità dell'uso di '\n' (che
è tra l'altro una delle tecniche che viene suggerita e che *potrebbe*
funzionare).
Mi sembrava strano che venisse messa in discussione la portabilità di
'\n' ! ;)
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)