2016-06-03 19 views
0

Ich möchte eine bestimmte Frage stellen und erhalten eine Y/N Antwort vom Benutzer eingelesen. Ich werde das Zeichen Y oder N verwenden müssen, um das Ergebnis der nächsten Frage zu ändern, weshalb ich den Charakter brauche, um gespeichert zu werden, damit ich ihn später abrufen kann. Ich möchte keine Zeichenfolge oder eine for/while-Schleife verwenden. Warum muss ich auch das * nach "% c *" einfügen?Scanf Y/N und Speichern für die zukünftige Verwendung

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
int avgTemp, lowestTemp, temperature; 
char choice ='Y'; 
char decision ='N'; 
printf("What is the average temperature?\n"); 
    scanf("%d", &avgTemp); 

printf("What is the lowest temperature in last 24 hours?\n"); 
    scanf("%d", &lowestTemp); 

printf("Has the temperature been over 99 degrees F for more than 30 minutes? 
     Please answer Y for yes and N for no.\n"); 
    scanf("%c*", &choice); 

printf("choice is %c", choice); 

return 0; 
} 
+0

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

+0

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? –

+0

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

Antwort

3

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.

+1

'"% c * "' bedeutet, ein Zeichen zu scannen und dann das Zeichen '*' zu scannen. Es bedeutet nicht "* bedeutet, scannen, sondern verwerfen". Es hätte das mit '"% * c "' – chux

+1

@chux Guter Fang bedeutet, danke. – Schwern

+0

UV für die gute Diskussion. (obwohl nicht ein Fan von 'getline()', da es anfällig für Ressourcenausnutzung ist) – chux

Verwandte Themen