2016-06-20 9 views
0

Ich möchte, dass dieser Code einen Benutzer auffordert, ein Jahr einzugeben und dann zu sagen, ob es ein Schaltjahr ist. Dann fragen Sie sie, ob sie ein weiteres Jahr überprüfen möchten. Im Moment stellt es die erste Frage in Ordnung und gibt die Antwort zurück.Scanf und While Loop wartet nicht auf Benutzereingabe

Das Programm druckt dann die nächste Frage, aber wartet nicht für die Eingabe und verlässt die while-Schleife. Ich habe nach einer Resolution zu den anderen Posts gesucht und dachte, ich hätte sie vielleicht, aber es macht dasselbe. Könnte jemand mit etwas helfen, was ein Programm sein sollte, um etwas zu schreiben und etwas Zeit zu verbringen, die jetzt zu Kopfschmerzen geworden ist? Ich habe viel komplexere Programme geschrieben und dieses hat mich frustriert. Ich hoffe, ich war klar. Sehr geschätzt!

//Check if the year is a leap year 
#include <stdio.h> 

#define YES 1 
#define NO 0 

void leapyear() 
{ 
    int year; 
    printf("Enter a year: \n"); 
    scanf("%i", &year); 
    int x = year % 4; 
    int answer; 
    if (x == 0) 
    { 
     answer = YES; 
    } 
    else 
    { 
     answer = NO; 
    } 
    if (answer == YES) 
    { 
     printf("The year %i is a leap year.\n", year);   
    } 
    else 
     printf("The year %i is not a leap year.\n", year); 
} 

int main (void) 
{ 
    char again; 
    printf("Would you like to check if a year is a leap year? y or n\n"); 
    scanf("%c", &again); 
    while(again == 'y') 
    { 
     leapyear(); 
     printf("Would you like to check if a year is a leap year? y or n\n"); 
     scanf("%c", &again); 
    } 
    return 0; 
} 
+3

Übrigens ist Ihre Methode zur Überprüfung des Schaltjahres falsch. – sjsam

+0

Danke sjsam. Ich war mir dessen bewusst, ich raste gerade durch und tief und siehe, ich war davon verzehrt! – rayzor

Antwort

1

Das Problem ist, dass, nachdem der Benutzer seines Jahr eingegeben und preßte die neuen Zeilen Zeichen eingeben wurden in dem Eingangspuffer gelassen, so in dem nächsten Durchlauf liest ‚\ n‘ und verlßt die Schleife. Verwenden Sie scanf(" %c", &again); innerhalb der While-Schleife.

+0

Danke RatHat. Das funktioniert perfekt! Also nur für mein Verständnis, war es das \ n auf der Frage in der Schleife, die das Problem verursacht hat? Würdest du sagen, es ist besser, in Zukunft einen Platz in scanf (wie oben) zu geben? Prost – rayzor

+0

Wenn der Benutzer das Jahr 1234 eingegeben und '\ n' eingegeben hat, war der im Eingabepuffer gespeicherte Wert 1234 \ n. Wenn Sie also scanf das nächste Mal aufrufen, wird '\ n' abgegriffen und die Schleife verlassen. Wäre es besser oder nicht, ein Leerzeichen zu verwenden ... hängt davon ab, was Sie tun, zum Beispiel scanf ("\ n% c", & wieder); oder das Löschen des Eingabepuffers würde auch funktionieren, denken Sie daran, dass ein neuer Zeilenkürzel bei der Verwendung von scanf und dem Versuch, Zeichen zu erhalten, verwendet wird. – StaticBeagle

+0

Verstanden. Danke für die Erklärung. – rayzor

1

Wenn Sie printf() endend mit \ n ausführen, wird scanf() es übernehmen.

Versuchen Sie, diese

scanf(" %c", &again) 
    ^a space here 

scanf("\n%c", &again) 

Or remove \n from printf because you might not want cursor to go to next line 

Oder nutzen getchar()

Sie können 1 Zeichen aus dem Puffer vor Scanf spülen oder entfernen()

Quelle Program doesn't wait for user input with scanf("%c",&yn);

+0

Danke für die Info/Feedback Priyesh. – rayzor

0

Sieht aus wie Code korrekt ist , können Sie das Zeilenvorschubzeichen "\ n" wie unten beschrieben aus Ihrer Printf-Anweisung entfernen und versuchen?

printf („Möchten Sie überprüfen möchten, ob ein Jahr ein Schaltjahr ist y oder n?“);

Da ähnliche Art von Problem, das ich in JAVA Scanner Klasse konfrontiert.

+0

Habe es sortiert, das war das Problem Dhanabalan. Trotzdem danke. :) – rayzor