2012-03-28 5 views
2

Ich habe ein einfaches Programm geschrieben, um zu überprüfen, ob der eingegebene Buchstabe ein Vokal ist, und mein Code funktioniert nicht. Das Programm sollte Zeichen nacheinander als Eingabe nehmen, bis% eingegeben wurde, wodurch es beendet wird. Es prüft, ob Eingabezeichen Vokale sind und gibt das Ergebnis aus. Es meldet auch einen Fehler, wenn die Eingabe kein Buchstabe ist. Das Problem ist, dass es im zweiten Schritt aus der Schleife ausbricht. Vielen Dank für Hilfe, im Voraus. PS Sorry, habe nicht geschrieben, dass es keine Fehlermeldung gibt, es bricht nur aus der Schleife.C While-Schleife - Code funktioniert nicht

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
int main(void) 
{ 
    char processed='q'; 
    while(processed != '%') 
    { 
    printf("Enter letter to check if it's a vowel, %% to quit.\n"); 
    char input = getchar(); 
    processed = tolower(input); 
    printf("%c\n", processed); 
    if (processed == '%') 
     break; 
    if (processed < 'a' || processed > 'z') 
    { 
     fprintf(stderr, "Input should be a letter\n"); 
     exit(1); 
    } 
    switch(processed) 
    { 
     case 'a': 
     case 'e': 
     case 'i': 
     case 'o': 
     case 'u': 
     case 'y': 
     printf ("Vowel\n"); 
     break; 
     default: 
     printf ("Non-vowel\n"); 
    } 
    } 
    exit(0); 
} 
+0

Was ist der Fehler? – Oleksi

+3

Wenn Sie "mit einer Fehlermeldung" eingeben, ist die allerletzte, die Sie eingeben sollten, die ** genaue ** Fehlermeldung. Wir können Ihren Bildschirm nicht sehen oder Ihre Gedanken von hier lesen, und da Sie bereits wissen, was der Fehler ist, könnten Sie den Gefallen tun, ihn zu liefern. Es macht es viel einfacher, Ihr Problem zu lösen, wenn Sie uns alle Informationen zur Verfügung stellen und es für uns einfacher macht, Ihre Antworten schneller zu erhalten. –

Antwort

5

Vermutlich geben Sie einen Charakter ein und drücken dann [ENTER]. In Wirklichkeit geben Sie also zwei Zeichen ein - den Buchstaben, den Sie eingegeben haben, und einen Zeilenvorschub (\n). Beim zweiten Durchlauf der Schleife erhalten Sie den Zeilenvorschub und stellen fest, dass es sich nicht um einen Buchstaben handelt. Sie haben also den Fehlerfall gefunden. Vielleicht möchten Sie etwas hinzuzufügen:

if (processed == '\n') { 
    continue; 
} 
+0

getchar() wartet nicht auf die Rückkehr eines Zeilenumbruchs, also warum würden sie eintreten? – lnafziger

+0

getchar() entspricht fgetc (stdin). deshalb, nachdem Sie [einige-char] + [enter] gedrückt haben, geben Sie ein, lesen Sie weiter von stdin auf der zweiten Iteration ... http://pubs.opengroup.org/onlinepubs/007904875/functions/fgetc.html – Naytzyrhc

+0

@Inafziger: Wenn die Standardeingabe liniengepuffert ist, was oft der Standard ist, wenn sie an ein Terminal angehängt ist, dann wird 'getchar()' angezeigt, um auf eine neue Zeile zu warten. – caf

3

Jemand anders erwähnt, dass Sie nach jedem Buchstaben des Eingangs eingeben treffen sind, und somit eine neue Zeile (‚\ n‘) in Ihr Programm zu senden. Da Ihr Programm keinen Fall hat, um damit umzugehen, funktioniert es nicht richtig.

Sie könnten Code hinzufügen, um den Newline zu behandeln, aber mit scanf wäre einfacher. Insbesondere dann, wenn ersetzt Sie

char indent = getchar(); 

mit

char indent; 
scanf("%c\n", &indent); 

scanf() würde die Newline behandeln und nur die Buchstaben wieder zurück Sie interessiert sind.

Und Sie sollten Scanf überprüfen() der Rückgabewert für Fehler natürlich.