|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
Problema C con Xcode e getchar().
Salve a tutti, ho appena iniziato ad utilizzare Xcode con macOs per sviluppare, per prendere un pò di confidenza ho iniziato a realizzare dei programmini di test, da eseguire da terminale.
Io ero abituato a scrivere codice C con linux, GCC e via insomma. Durante il test, ho provato a fare la somma da due numeri inseriti "in corsa". Del tipo: Inserire A: "scrivi il numero a" Inserire B: "scrivi il numero b" questo normalmente (tralasciando il resto, ma considerando solo l'acquisizione) viene fatto con: printf("Inserisci A:\n"); a = getchar(); printf("Inserisci B:\n"); b = getchar(); il problema è che lui continua a prendere dati dalla linea di comando fino ad invio e se per esempio io premo 3 e invio (quando sono a: "Inserisci A:") lui da ad "a" il valore 3 (corretto) e però considera "b" come valore del tasto enter. Mi spiego meglio, invece di chiedere a e poi b, per assegnare ad esempio il valore 3 ad "a" e 5 a "b" quando mi viene chiesto "Inserisci A:" devo digitare 35 e invio. L'unico modo per risolvere il problema è : printf("Inserisci A:\n"); a = getchar(); getchar(); //aggiugere questo printf("Inserisci B:\n"); b = getchar(); Questo non è un comportamento corretto del linguaggio C, come mai succede questo? Un'altra domanda come faccio ad usare gcc da terminale? Sono nuovo di osx
__________________
Wof |
![]() |
![]() |
![]() |
#2 | |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
Quote:
Come insomma se la presione d'invio fosse un salvare i dati in memoria e chiudere lo stdin. E questi poi vengono letti dalla pila salvata.
__________________
Wof |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2006
Città: Trento
Messaggi: 4048
|
È un problema legato all'utilizzo di getchar(), ti conviene usare uno scanf
(Se vuoi usare getchar dovresti fare un ciclo while e stopparlo quando premi invio, evita fflush o altro)
__________________
trattative cocluse positivamente su hwupgrade |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
ho già provato con scanf, ma niente da fare, gestisce lo stdin in modo anomalo...
__________________
Wof |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Feb 2006
Messaggi: 61
|
Non so se ho capito bene, ma a me funziona correttamente
![]() A = getchar() // assegna il primo valore se poi pigi ENTER, è normale che venga eseguita l'istruzione B= getchar(); assegnando a B il valore di ENTER Con scanf funziona normalmente, che problemi ti da ? int a,b; printf("inserisci A:\n"); //a= getchar(); scanf("%d",&a); printf("inserisci B:\n"); //b= getchar(); scanf("%d",&b); printf("somma=%d",a+b); Per quanto riguarda GCC, è stato tolto in favore di LLVM da non so bene che versione di XCode, ma rimane disponibile come pacchetto aggiuntivo di Xcode in Preferenze-> Downloads-> Command Line Tools |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
Quote:
Se invece io scrivo 34 e invio lui assegna 3 ad A e 4 a B.. Per fare in modo che ATTENDA la pressione del nuovo numero e lo assegni corettamente devo aggiungere un terzo getchar() subito dopo il secondo.. Idem con scanf() che versione di Xcode hai? E' un baccone enorme mi sa e spero del terminale di Xcode e non del compilatore... Edit: Dopo aver installato il gcc con scanf funziona, però rimane il problema getchar(), forse sarebbe meglio scrivere direttamente al supporto Xcode
__________________
Wof Ultima modifica di Sfasciacarene : 20-08-2012 alle 18:28. Motivo: nuovo test |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Feb 2006
Messaggi: 61
|
ma è proprio così che deve funzionare getchar()
![]() Non capisco invece la cosa di scanf, visto che a me funziona con o senza gcc, sia su osx che su linux, sia in xcode che in terminale ![]() |
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
Quote:
Penso che mi vergognerò per 2-3 anni ![]()
__________________
Wof |
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Feb 2010
Messaggi: 223
|
Con scanf pero era strano, forse non aveva compilato e faceva partire il vecchio, o ho fatto un run senza compilare, provandolo da 10 min puó essere
![]() Ti ho fatto perdere tempo ![]() ![]()
__________________
Wof |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:26.