• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C Programmieren - Abfrage auf Benutzereingabe

Xentus

Idared
Registriert
25.06.10
Beiträge
24
Hallo,

da ich schon letztes Mal so hilfreiche Antworten bekommen hab, möchte ich es jetzt gleich nochmal versuchen.
Habe genauso wie bei den Umlauten schon wieder ein Problem was bei Windows funktionert, bei Mac aber nicht laufen will.

#include <stdio.h>

int main(void)
{
char cAnswer;

do{
printf("(J/N) :");
fflush(stdin);
scanf("%c",&cAnswer);

}while(cAnswer == 'J' || cAnswer == 'j');

return(0);
}​

Bei dem "fflush(stdin);" bin ich mir nicht sicher ob das davor gehört oder nicht. Auf jeden Fall wird das Programm sofort nach der "printf" Ausgabe beendet.
 

Xentus

Idared
Registriert
25.06.10
Beiträge
24
Okey danke :).. Hab es jetzt mal mit getchar versucht, allerdings beendet es jetzt nur bei "nn" nicht bei "n".
Zusätzlich funktioniert es mit " == 'j' " nicht. Kurze Hilfe^^?

#include <stdio.h>
int main(void)
{
char c;

do{

printf("(J/N) :");

c = getchar();

}while((c = getchar()) == 'j' && c != EOF);

return(0);
}
Zusätzlich die Frage, gibts ne Website mit allen Ausnahmen die von Win zu Mac nicht funktioneren?
 

martinv2

Doppelter Prinzenapfel
Registriert
14.04.12
Beiträge
437
1. Warum 2 x getchar() ?
2. c muss ein int sein.
 

Xentus

Idared
Registriert
25.06.10
Beiträge
24
Puuuhh :D
keine Ahnung so hat es halbwegs funktioniert.

int c;
do{
printf("(J/N) :");
}while((c = getchar()) == 'j' && c != EOF);​

Das wäre die Ausgabe:

blaaaa:~ blub$ ./a.out
(J/N) :j
(J/N) :blaaaa:~ max$ gcc test.c
blaaaa:~ blub$ ./a.out
(J/N) :n

D.h. nun geht es überhaupt nicht mehr in die Schleife rein.

Mit dem " c= getchar(); " nach dem "printf" gibt es die Ausgabe:

blaaaa:~ blub$ ./a.out
(J/N) :j
blaaaa:~ blub$ gcc test.c
blaaaa:~ blub$ ./a.out
(J/N) :n

Hier auch ohne den nächsten Schleifendurchlauf.
 

martinv2

Doppelter Prinzenapfel
Registriert
14.04.12
Beiträge
437
Wenn Du vor dem return(0) noch ein printf("%d\n", c); einfügst, siehst Du, dass das Programm nach Eingabe von "j" +RETURN noch ein LF (ASCII 10) im Eingabepuffer hat. Siehe comp.lang.c FAQ Fragen 12.26a und 12.26b
 

Xentus

Idared
Registriert
25.06.10
Beiträge
24
Puuuuuuuuuhhh ... also, was du mir da geschickt hast. Mir ist jetzt klar, er nimmt trotzdem noch das "Return" als Zeichen war.
Was ich selbst auch bei dem FAQ nicht versteh wie man das umgehen kann.
Ich brauch was ähnliches wie fflush??
 

martinv2

Doppelter Prinzenapfel
Registriert
14.04.12
Beiträge
437
Du must nur, wie in 12.26b gezeigt, das getchar() in eine eigene Schleife verpacken, die alles wegschmeisst, was wie "\n" aussieht. Wenn das Programm dann aus dieser Schleife ausbricht, hast Du ein verwertbares Zeichen, das Du gegen "j" (oder EOF) testen kannst.
 

Scotch

Bittenfelder Apfel
Registriert
02.12.08
Beiträge
8.038
Herr im Himmel, was ist das hier, experimentelle Informatik? Tip: Es ist nicht egal, ob man eine while ... do oder eine do ... while Schleife programmiert. Noch ein Tip: getchar() liest das erste Zeichen eines streams. Ein \n ist nur das erste "Zeichen", wenn kein Zeichen eingegeben wurde. Das fängt man anders ab (ja, das war noch ein Tip).
 

Xentus

Idared
Registriert
25.06.10
Beiträge
24
Also irgendwie bin ich jetzt darauf gekommen ...

do
{
printf("Weiter gehts! [j/n]");
c = getchar();
getchar();
printf("Du hast '%d' gedrückt\n", c);
}while( c == 'j');

... aber keine Ahnung warum :D

Warum haut mir ein weiteres getchar(); die "Return" weg?
Und was bringt mir die Sache mit dem "EOF"?