Auch, warum muss ich die * nach "% c *" enthalten?
%c*
bedeutet, für ein Zeichen zu scannen, und dann wird ein *
(die es verwerfen). Vielleicht meinst du %*c
was bedeutet, dass der Scan aber verwerfen. Du brauchst keines von beiden.
scanf
ist eine sehr problematische Funktion und sollte vermieden werden. Ihr Programm veranschaulicht das Problem. scanf
liest keine ganze Zeile. scanf
wird nur bis zu dem, was Sie für gefragt haben, stdin und dann stoppen. Dies bedeutet, dass zusätzliche Eingaben und Zeilenumbrüche manchmal in dem Eingabestrom für den nächsten ahnungslosen scanf
verbleiben können. Aus der Manpage ...
Jedes aufeinanderfolgende Zeigerargument mit jedem aufeinanderfolgenden Konvertierungsspezifizierer entspricht richtig muss (aber die * Umwandlung siehe unten). Alle Konvertierungen werden durch das Zeichen% (Prozentzeichen) eingeführt. Die Formatzeichenfolge kann auch andere Zeichen enthalten. Leerzeichen (z. B. Leerzeichen, Tabulatoren oder Zeilenumbrüche) in der Formatzeichenfolge entsprechen einer beliebigen Anzahl von Leerstellen in der Eingabe, einschließlich keiner. Alles andere stimmt nur mit überein. Der Suchlauf stoppt, wenn ein Eingabezeichen nicht mit einem solchen Formatzeichen übereinstimmt. Das Scannen wird auch beendet, wenn eine Eingabeumwandlung nicht möglich ist (siehe unten).
Dies macht es sehr einfache Zeichen auf dem Eingangspuffer versehentlich zu verlassen. Jeder Ihrer scanf("%d")
wird die Nummer einlesen und stoppen. Dies hinterlässt eine neue Zeile im Eingabepuffer. Das ist in Ordnung für %d
weil ...
Vor der Konvertierung beginnt, die meisten Conversions Leerraum überspringen
... aber nicht für %c
.
Übereinstimmungen mit einer Folge von Zeichen mit Breitenzählung (Standard 1); Der nächste Zeiger muss ein Zeiger auf char sein, und es muss genügend Platz für alle Zeichen vorhanden sein (es wird keine abschließende NUL hinzugefügt). Das übliche Überspringen von führenden Leerzeichen wird unterdrückt. Um Leerraum zuerst zu überspringen, verwenden Sie ein explizites Leerzeichen im Format.
Sie müssen also scanf(" %c")
, um es überhaupt arbeiten.
scanf
sollte vermieden werden, weil es sehr ist, sehr anfällig für unerwarteten Eingang. Versuche die erste Frage mit "foo" zu beantworten. Alle scanf("%d")
wird im Stillen fehlschlagen.Und scanf("%c")
wird f
lesen.
Lesen Sie stattdessen die gesamte Zeile mit getline
(bevorzugt, da es Speicherzuweisung für Sie behandelt) oder fgets
und dann sscanf
für die resultierende Zeichenfolge. Dies vermeidet alle obigen Probleme.
Wenn Sie sagen, gespeichert, um später abgerufen zu werden, meinen Sie Persistenz? Sie können das Zeichen in eine Textdatei schreiben, die gelesen werden kann, wenn Ihre Anwendung den vorherigen Wert kennen muss. – Sterls
Gespeichert, um später in der endgültigen printf-Anweisung verwendet zu werden, die ich gerade hinzugefügt habe. Alles, was es druckt, ist "Wahl ist" und ich möchte, dass es den Buchstaben der Wahl druckt, wenn ich das kann? –
Das bedeutet, dass Sie das falsche Zeichen in "Wahl" speichern - höchstwahrscheinlich drücken Sie die Return-Taste direkt nach Eingabe eines Zeichens. Versuchen Sie mit einem Leerzeichen anstelle des '*' in diesem scanf. – usr2564301