2012-03-28 3 views
2

Я написал простую программу, чтобы проверить, является ли входное письмо гласным, а мой код не работает. Программа должна принимать символы как входные один за другим, пока не будет введено значение%, что приведет к его завершению. Он проверяет, являются ли входные символы гласными и печатает результат. Также он сообщает об ошибке, если ввод не является буквой. Проблема в том, что она выходит из цикла на втором шаге. Благодарим вас за помощь, заранее. PS Извините, не написал, что нет сообщения об ошибке, он просто выходит из цикла.C while loop - код не работает

#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

Какая ошибка? – Oleksi

+3

Когда вы вводите «с сообщением об ошибке», самое следующее, что вы должны ввести, - это сообщение ** точное ** сообщение об ошибке. Мы не можем видеть ваш экран или читать ваш ум отсюда, и, поскольку вы уже знаете, в чем ошибка, вы можете сделать это. Это значительно облегчает решение вашей проблемы, если вы даете нам всю информацию, которая будет использоваться для этого, и упрощение для нас дает вам ответы быстрее. –

ответ

5

Предположительно, вы вводите символ, а затем нажмите [ENTER]. Итак, на самом деле вы вводите два символа - букву, которую вы набрали, и линию (\n). Во второй раз через цикл вы получаете фид строки и обнаруживаете, что это не письмо, поэтому вы попадаете в случай ошибки. Может быть, вы хотите добавить что-то вроде:

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

getchar() не ждет возвращения новой строки, так почему бы им нажать enter? – lnafziger

+0

getchar() эквивалентен fgetc (stdin). поэтому после того, как вы нажмете [some-char] + [enter], введите следующую строку из stdin на второй итерации ... http://pubs.opengroup.org/onlinepubs/007904875/functions/fgetc.html – Naytzyrhc

+0

@Inafziger: Если стандартный ввод является строковым буфером, который часто является значением по умолчанию, если он присоединен к терминалу, то 'getchar()', похоже, будет ждать новой строки. – caf

3

Кто-то упомянул, что вы удара ввести после каждой буквы ввода, и, таким образом, посылая символ новой строки («\ п») в вашу программу. Так как ваша программа не имеет случая справиться с этим, она не работает правильно.

Вы можете добавить код для обработки новой строки, но с помощью scanf было бы проще. В частности, если вы заменили

char indent = getchar(); 

с

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

зсапЕ() будет обрабатывать символ новой строки и просто вернуться обратно письма вы заинтересованы.

И вы должны проверить зсапЕ() Разумеется, возвращаемое значение для ошибок.