eFrane
Kann mir mal jemand erklären, warum dieser Code bei Falscheingabe die printf()-Ausgabe immer häufiger als einmal macht?
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
|
#include <stdio.h>
int main(void) {
char test;
while(1) {
printf("Make a choice (y/n): \n");
scanf("%c", &test);
if (test == 'y' || test == 'n') break;
}
return 0;
}
|
|
ThiefMaster
Ganz einfach: du liest auch den Zeilenumbruch.
Chris Hunter
Ich verstehs nicht....
scanf hält die ausgabe doch an und liest die eingabe aus stdin und friemelt das in die angegebene variabel....
oder seh ich das falsch? wie verhält sich scanf denn genau?
eFrane
Habe eine Lösung gefunden, die sich glaube ich auf das was ThiefMaster mit dem Zeilenumbruch bezieht. Aber warum es mit diesem scanf() funktioniert ist mir trotzalledem ein Rätsel, bzw. warum es mit dem anderen nicht geht.
| code: |
1:
|
scanf("\n %c", &test); |
|
ThiefMaster
| Zitat: |
| Ich verstehs nicht.... scanf hält die ausgabe doch an und liest die eingabe aus stdin und friemelt das in die angegebene variabel.... oder seh ich das falsch? wie verhält sich scanf denn genau? |
%c ist ein Zeichen - auch Zeilenumbrüche sind Zeichen. Also liest du bei "x\n" zuerst das x und dann das \n.
Allgemein ist scanf keine wirklich schöne Art und Weise, Benutzereingaben abzufragen.
Zumindest unter unixoiden Systemen ist readline() definitiv komfortabler. Wenn nötig kann man das danach dann natürlich mit sscanf zerlegen, wobei oft ein strcasecmp oder atoi ausreicht.
Chris Hunter
danke, des hab ich mir fast schon so gedacht
Hanfling
Das Problem mit scanf() ist halt das sich oft davor oder nach noch Zeichen im stdin Stream befinden. Ich mach (in den Fällen wo ich scanf benutze, meist wenn mich wer was bzgl. dessen fragt) das meistens in der Art:
| code: |
1:
2:
3:
4:
5:
|
fseek(stdin, 0, SEEK_END)
printf("Enter something: ");
scanf(...);
|
|
Bei nur einem Zeichen kann man auch gut getchar() benutzen, btw-