Anfänger braucht hilfe zu getchar()
-
HALLO,
ich bin neu in C/C++,
kann aber schon BB und PHP.
Jetzt hab ich eine Frage zu folgendem Code:#include <stdio.h> main() { char c; c=getchar(); putchar(c); c=getchar(); putchar(c); c=getchar(); putchar(c); }
1.Warum wird nur 1*abgefragt?Ich hab doch 3*getchar()
2.Warum wird der text nicht mehr ausgegeben?Ich hab doch putchar(),oder ist das für was anderes zuständig?
3.Warum kann man in die Char Variable c gleich mehere Zeichen einlesen?Ich denke jedenfalls das das eigelesen wird da man ja mehrere zeichen im Programm eingeben kann.Oder wird c immer überschrieben,also ist nur das letzte zeichen der eingabe in c?Hoffe das mir jemand meine Fragen mit Erklärung beantworten kann.
Danke
Xalon
-
ausser dem eingegebenen zeichen befindet sich noch das zeichen für die 'return' taste im eingabepuffer. deshalb hat das zweite getchar scheinbar keine wirkung
-
Du kannst das "Neue-Zeile-Zeichen" (enter) rausfiltern :
/*...*/ c = getchar(); while((c = getchar()) != '\n'){;} putchar(c); /*...*/
-
Hi,
zu 1.)
Es wird 3* "abgefragt". Beim ersten mal gibst du ein zeichen ein und
bestätigst mit return. Das Zeichen für ruturn (fluchtsequenyz '\n') wird
dann aber schon bei der 2. Abfrage als Eingabe aufgefasst und springt zur 3. .zu 2.)
Der Text wird ausgegeben, die '\n'´s siehst du natürlich nicht.
Gib doch mal
- a, enter, b ein, oder 3* enterzu 3.)
Du kannst zwar mehrere Zeichen auf der Tastatur eingeben, diese werden aber
nicht an die Adresse der Variablen im Speicher geschrieben, sondern zunächst
in einen Tastaturpuffer/Cache geschrieben. Beim bestätigen mit Enter arbeiten
dann die von der Tastatur lesenden Funktionen den Puffer ab. Es werden also
bei Eingaben > 3 Zeichen immer nur die ersten 3 genommen und die Variable
überschrieben.Tipp:
Um das Enter-Zeichen im Tastaturpuffer zu löschen setzt du nach jedem
getchar() einwhile(getchar()!='\n');
oder ein
fflush(stdin);
Das bewirkt ein "entleeren" des Tastaturpuffers bis zum '\n'.
Hoffe das hilft dir
b4sh0r
-
Xalon schrieb:
Jetzt hab ich eine Frage zu folgendem Code [...]
In Bezug auf getchar() haben meine Vorredner schon einiges gesagt. Hier noch ein wenig Formales. Der Rahmen eines C-Programms sollte so aussehen (falls keine Argumente an main() übergeben werden sollen):
int main(void) { /* code */ return 0; }
[...] Oder wird c immer überschrieben, also ist nur das letzte Zeichen der Eingabe in c?
So ist es. ein Variable vom Typ char fasst genau ein Zeichen, aber solange die (char) Variable nicht als const (Konstante) deklariert ist, kannst Du sie natürlich auch "überschreiben".
Bsp:
char c;
c = 'a';// c enthält das Zeichen 'a'
c = 'b';
// c enthält nun das Zeichen 'b'
-
Danke,jetzt hab ichs kapiert.
Xalon
-
Das bewirkt ein "entleeren" des Tastaturpuffers bis zum '\n'.
Nope. Das Bewirkt gar nichts. fflush() ist nur für das entleeren von Ausgabe-Streams. Das flushen von Eingabe-Streams ist undefiniert (steht auch in der FAQ)
Und dann fällt mir noch auf, dass getchar() eigentlich eine int zurückliefert. Ihr benutzt aber eine char-variable. Das könnte zum Problem wenn man nachher vielleicht auf EOF prüfen möchte.
Jetzt noch was generelles: stdout ist meistens ein gepuffertet stream. Ihm eueren Fall ist der stream, da er mit einem Terminal (Dos-Fenster) verbunden ist, sogar line-gepuffert[1]. Das heißt, der stream wird entweder geflusht wenn ein new-line-character ('\n') geschrieben wird oder es explizit gefordert wird[2].
Ich würde sagen, dass die stdc-library eigentlich ungeignet ist ein benutzerfreundliches user-interface zu erstellen. Dafür gibt es libraries wie (n)curses
mfg
--
[1] schreckliche Übersetzung..
[2] zB mit fflush()