View Full Version : Problema C con Xcode e getchar().
Sfasciacarene
19-08-2012, 11:17
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
Sfasciacarene
19-08-2012, 18:55
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
Sembrerebbe quasi che quando uso getchar(), si apri un nuovo file che in questo caso è lo stdin, tutto quello che scrivo fino alla pressione di enter venga salvato e POI faccia TUTTE le letture da quello che è stato passato la prima volta.
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.
È 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)
Sfasciacarene
19-08-2012, 22:13
È 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)
ho già provato con scanf, ma niente da fare, gestisce lo stdin in modo anomalo...
Non so se ho capito bene, ma a me funziona correttamente :wtf:
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
Sfasciacarene
20-08-2012, 18:15
Non so se ho capito bene, ma a me funziona correttamente :wtf:
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
Il problema è che a me, esce: "inserisci A:" inserisco ad esempio 3 e premo invio, e invece di chiedere "inserisci B:" e ATTENDERE la pressione del nuovo numero lui assegna 3 ad A e assegna \n a B passando al risultato...
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
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 :wtf:
Sfasciacarene
20-08-2012, 19:27
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 :wtf:
Chiedo umilmente perdono, mamma mia che c****e, mai usato getchar(), lo uso per provare x-code e da pirla mi infogno, bastava leggere le librerie, avevo addirittura iniziato a leggere i disasemblati in assembly per trovare il Bacco.
Penso che mi vergognerò per 2-3 anni :(
Sfasciacarene
20-08-2012, 20:12
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 :) grazie di avermelo fatto notare sennó mi rimaneva il dubbio amletico :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.