Newsgroup: it.comp.lang.c
Titolo: problemi con goto

salve, ho qualche problema con il salto goto.
#include <stdio.h>
int main()
{
   char x;
start:
   printf("Digita 'a' o 'b': ");
   scanf("%c", &x);
   if ((x = getchar()) == 'a' || 'A')
      goto start;
   else if ((x = getchar()) == 'b' || 'B')
      goto end;
end:
   return 0;
}
Lo compila normalmente, però quando lo vado a eseguire non vede mai 
l'etichetta end, qualunque sia il carattere immesso, perchè? Cosa sbaglio?
Inoltre, se tolgo ||'A' e ||'B' non vede nemmeno l'etichetta start.
Il problema non sorge se metto un int e uso ad esempio:
   if (x = 1)
      goto start;
   else if (x = 2)
      goto end;

 wrote in message
news:dt389.75681$n04.2...@twister2.libero.it...

1 - scanf() e getchar() fanno due volte lo stesso lavoro
2 - nella if () la x varipetura dopo il segno or (||)
3 - manca il caso in cui il carattere non sia  'a' o 'b'  e
     quindi il programma esce dopo il secondo if.
prova il codice che segue che funziona:
#include <stdio.h>
int main()
{
int x;
START:
printf("Digita 'a' o 'b': ");
x = getchar();
flushall(); /* svuota il buffer */
if (x == 'a' || x == 'A')
goto START;
else if (x == 'b' || x == 'B')
goto END;
else {
printf ("Carattere \< %c \> non ammesso\n",x);
goto START;
}
END:
return 0;
}

> flushall(); /* svuota il buffer */
 
Il gcc mi dice:
/tmp/ccjZc0CQ.o: In function 'main':
/tmp/ccjZc0CQ.o(.text+0x3ae): undefined reference to 'flushall'
collect2: ld returned 1 exit status
Che signfica?

 Che signfica?
Che flushall non e` nella libreria standard. Sostituisci quella funzione
con questo ciclo (vuoto):
while(getchar() != '\n')
        ;
Serve per togliere  dal buffer eventuali altri caratteri  digitati ed il
newline (invio). Non fare  fflush(stdin), altrimenti vengo personalmente
a tirarti le orecchie :P
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Al termine di un pranzo di nozze mi hanno dato un
amaro alle erbe cosi' schifoso che perfino sull'etichetta
c'era un frate che vomitava.


Mai pensato che il goto non serve...?
--
Luigi Mantellini
Per il pessimista il bicchiere č mezzo vuoto,
per l'ottimista č mezzo pieno,
per un ingegnere č semplicemente sovradimensionato rispetto l'uso.

Ciao,
da una prima analisi del codice ho notato che commetti
alcuni errori abbastanza gravi..
if ((x = getchar()) == 'a' || 'A')
chi scrive una espressione di questo tipo dovrebbe avere a portata
di mano la tabella delle precedenze degli operatori del C altrimenti
commette, nella stragrande maggioranza dei casi, errori difficilmente
riconoscibili.
il tuo if verifica il risultato della seguente espressione
x avrà il valore del codice ASCII del carattere introdotto . supponiamo che
a=60 B=80 e che tu inserisca il carattere a :
if ( 60 == 60 || 80 )
l'espreesione e' valutata nel seguente modo :
60 || 60 = TRUE return 1
60 == 1 FALSE return 0
i tuoi if valutano espressioni che saranno sempre FALSE !!!!
Questa e' la verisione corretta del tuo if :
x = getchar();
if ( x == 'a' || x == 'A')
il problema e' risolto .
Saluti
Gauss

--------------------------------
Inviato via 
http://usenet.libero.it

l'etichetta end, qualunque sia il carattere immesso, perchč? Cosa sbaglio?
[snip]
#include <stdio.h>
int main()
{
    char x;
    do {
        printf("Digita a oppure b: ");
        x = getchar();
        while (getchar() != '\n');
        if (x != 'a' && x != 'A' && x != 'b' && x != 'B')
            printf("carattere non valido\n");
    } while (x != 'b' && x != 'B');
    return 0;
}
-- 
Ciao, Giuseppe

 i tuoi if valutano espressioni che saranno sempre FALSE !!!!
No, e` il contrario. Con un po' di parentesi quell'if diventa:
if (((x = getchar()) == 'a') || ('A'))
Scritto un po' meglio:
x = getchar();
if ((x == 'a') || ('A'))
L'operatore  di confronto  ha priorita`  maggiore rispetto  ai booleani.
Quindi prima verra` valutata l'espressione (x == 'a'): se questa e` vera
il valore di verita` di tutta l'espressione e` /vero/; se e` falsa viene
valutata anche la seconda parte ('A') che e` sicuramente maggiore di 0 e
quindi vera. In  conclusione, il  valore di quell'espressione  e` sempre
/vero/.


 Ciao ti consiglierei di usare una funzione e non il GoTo.
