Hilfe eine Frage bzg scanf()
-
Hallo folgendes ich brauche eure hilfe.
Könntet ihr mir bitte erklären was ich mit der scanf(%c%*c) aus dem gesamt Quelcodetext interpretieren kann..
Also was genau macht hier die scanf()!Hier der Code
/do_while2.c/
#include <stdio.h>int main(void)
{
char response;printf("Denk Dir eine Nummer zwischen 1 und 100 aus. \n"); printf("Das errate ich in 7 oder weniger Versuchen \n \n"); do{ int lo = 1, hi = 100; int guess; while(lo <= hi) { guess = (lo+hi) / 2; printf("Ist es %d \n",guess); printf("((h)oeher/(n)iedriger/(j)a: \n"); fflush(stdout); scanf("%c%*c",&response); if (response == 'h') { lo = guess + 1; } else if (response == 'n') { hi = guess - 1; } else if (response != 'j') { printf("Erraten ...:-)\n"); } else break; } /*Resultat ausgeben*/ if (lo > hi ) printf("Du schummelst ! \n"); else printf("Deine Nummer lautet: %d \n",guess); printf("Noch ein Spiel (j)a/nein: \n"); fflush(stdout); scanf("%c%*c",&response); } while (response == 'j'); return 0; }
Über eine antwort würde ich mich sehr freuen.,.
Im voraus Danke !
-
Ich versuche es mal mit Hilfe zur Selbsthilfe:
https://en.cppreference.com/w/c/io/scanf
Mit dieser Referenz: Was würdest du sagen, was es genau macht?
-
Hier noch eine andere Referenz: http://www.cplusplus.com/reference/cstdio/scanf/
-
An sich verstehe ich ja was das %*c per seh macht. Also ein beispiel Der Benutzer gibt auf der Kommandozeile z.B. das Datum ein:19.12.2019
in deinen Variablen steht dann:
day = 19
month = 12
year = 2019
die Punkte dazwischen werden vom compiler mit der Angabe im scanf (also z.b mit %*c ) verglichen und dannach verwofen.
scanf("%d%*c%d%*c%d", &day, &month, &year);
Aber warum hier ich gebe als input z.b 'h' ein wieso muss danach noch ein %*c..Also hier scanf("%c%*c",&response);
Da dann das Programm wenn nicht es so schreiben würde nicht funktioniert scanf("%c",&response); .
Das Programm kommt aus dem Buch C von a bis z. Und hier wird es eben nicht erklärt was der Sinn da hinter ist.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
wieso muss danach noch ein %*c..Also hier scanf(%c%*c,&response);
In Deinem Beispiel ist das
%*c
dafür da, den Newline-Character ('\n'
) zu lesen und wegzuwerfen. Würde man das nicht machen, würde er vom nächstenscanf("%c", &whatever);
gelesen.Oft möchte man aber sichergehen und nicht nur das nächste Zeichen wegwerfen (das nicht zwangsweise schon
'\n'
ist), sondern auch den Rest der Zeile:#include <stdio.h> int main(void) { char ch; scanf("%c%*[^\n]%*c", &ch); // versuche das mal mit %*[^\n] und einmal ohne printf("'%c' (%d)\n", ch, ch); // check next character: scanf("%c", &ch); printf("'%c' (%d)\n", ch, ch); }
und gib mal nur einen, mal mehrere Buchstaben ein.
-
@Swordfish Ok danke für die Antwort ich werde das mal jetzt ausprobieren.
-
Der ganze Spaß, selbst die Verbesserung von Swordfish, ist fehleranfällig, schwer zu lesen, inflexibel, und unnötig.
scanf
kann das viel einfacher und besser:scanf(" %c", &response); // Man beachte das Leerzeichen
und gut ist.
@Computer_Nerd_C : Wo hast du das denn her? Nicht nur, dass dir deine Quelle nicht erklärt hat, was das genau macht, es ist halt aus den genannten Gründen nicht so gut. Obwohl es eine viel einfachere und in jeder Hinsicht überlegene Lösung gibt. Daher solltest du die Wahl deiner Quellen überdenken.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
Das Programm kommt aus dem Buch C von a bis z.
Wieder einmal der böse Wolf ...
-
Dieser Beitrag wurde gelöscht!
-
@manni66 sagte in Hilfe eine Frage bzg scanf():
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
Das Programm kommt aus dem Buch C von a bis z.
Wieder einmal der böse Wolf ...
@Computer_Nerd_C : Nimm das Ernst! Der verlinkte Thread ist kein Scherz oder Überteibung. Die Bücher von J. Wolf sind wirklich so schlecht, dass du davon wirklich dümmer wirst und hinterher schlechter C kannst, als ohne sie.
-
Okay das ist schon echt heavy mit diesem Wolf. Könntet ihr mir vieleicht gute Literatur empfehlen? Ach noch wieso printf("%*d\n",i,i);
c
c/*weite.c*/ #include <stdio.h> int main(void) { int i=-10; printf("%5d \n",i ); printf("%*d \n",i,i ); return 0; }
Es tut mir leid das ich mit solchen fragen belästigen muss. Aber es wird halt nichts erklärt. Da ich schon es verstehen würde wenn es halt irgendwo erklärt wäre. Oder solle ich etwa aus intuition lernen wenn es nach dem Herrn Wolf geht.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
// Code
Diese "Beispiele" sind einfach nur grober Unfug. Lass sie bitte. Nicht. Ansehen.
Willst Du eigentlich C lernen oder C++?
Zusatzfrage wenn Die Antwort C ist: Willst Du irgendwann auch C++ lernen?
-
Über die Bedeutung von
*
inprintf
auch die Hilfe zur Selbsthilfe:
https://en.cppreference.com/w/c/io/fprintf
http://www.cplusplus.com/reference/cstdio/printf/
Das ist aber etwas ganz ungewöhnliches, das man vielleicht einmal im Leben braucht. Und ganz bestimmt nicht mit -10 als Argument.Bezüglich Büchern: "The C Programming Language" ist das Standardwerk.
-
@Computer_Nerd_C Tja, das ist ein witziger Scanf- Formatstring, das %c liest den char ein, soweit klar. Das %*c dient dazu, das beim Drücken der Return- Taste unweigerlich im Tatstaturpuffer landende newline zu lesen und zu verwerfen. Aschenputtelmäßig, den ersten ins Töpfchen, den nächsten ins Kröpfchen.
Kannsteda nachlesen: http://www.cplusplus.com/reference/cstdio/scanf/
@edit Aber die Anderen haben schon recht, besonders eingabesicher ist das nicht. Kann man zu leicht außer Tritt bringen.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
Ach noch wieso printf("%*d\n",i,i);
Schließe nicht vom Verhalten von ´printf´ auf das Verhalten auf ´scanf´ und umgekehrt.
Die mögen gleich aussehen, die Bedeutung der Formatspecifier ist anders.
-
@DirkB Ja klar bloß was ist die Aufgabe davon also von * und wieso zwei mal i jetzt in printf. Also dieses Buch ist wircklich für die Tonne.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
Also dieses Buch ist wircklich für die Tonne.
@Swordfish sagte in Hilfe eine Frage bzg scanf():
Willst Du eigentlich C lernen oder C++?
Zusatzfrage wenn Die Antwort C ist: Willst Du irgendwann auch C++ lernen?
-
@Swordfish Ja erst C danach C++. Mich hat immer die Systemprogramierung interssiert.Habe jahre lang in Assembler Programiert bis ich mich seit 3 Wochen entschieden habe c und danach c++ zu lernen. Für mich ist der Assembler klarer und verständlicher also wenn man sich solange auf der Abstrakten umgebung angepasst hat.Tue ich mich stand jetzt noch etwas schwer. Da eine Hochsprache 2.Abstraktionsebene also c .Doch was ganz anderes ist im Vergleich dazu.
-
@Computer_Nerd_C sagte in Hilfe eine Frage bzg scanf():
ja klar bloß was ist die Aufgabe davon also von *
http://www.cplusplus.com/reference/cstdio/printf/ sagt zu *:
The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.und wieso zwei mal i jetzt in printf.
Einmal für die Mindesbreite und einmal der Wert der ausgegeben werden soll.
Warum i für die Breite? Das weiß wohl nur der Autor (oder auch nicht).
-
@DirkB Danke...!