2016-11-20 3 views
1

Я хочу создать программу, которая только принимает символы нижнего регистра от пользователя. И я хочу, чтобы он печатал ошибку всякий раз, когда есть пробел, заглавная буква на входе или любой символ рядом с алфавитом. Но мой код ведет себя непредвиденным образом, я не уверен, почему. Сообщение об ошибке печатается, только если пробел или заглавная буква были первым символом, который был введен во вход. Как это возможно, хотя я просматриваю всю строку с помощью fgetc, ищущего пробел?Обнаружение пробелов во входных данных

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

int main (void) 
{ 
    char buff[BUFSIZ]; 
    char ch = fgetc(stdin); 
    if (fgets(buff, sizeof buff, stdin) != NULL && islower(ch)) { 
     while (ch != ' ' && ch != EOF) 
      { 

       printf("There are No Spaces in the input!\n"); 
       return 0; 
      } 
     } 
     printf("Error\n"); 
} 

Спасибо за вашу помощь, заранее

+0

[для проверки использования пробелов 'isspace'] (http://stackoverflow.com/q/15326729/995714), а [' fgets' возвращает 'int', а не' char'] (http: // stackoverflow .com/q/8464030/995714), потому что EOF и код символа 0xFF различаются –

+0

«Я хочу создать программу, которая принимает только символы нижнего регистра от пользователя». и «печатать ошибку всякий раз, когда есть пробел ...» - >> Итак, вы хотите «принять» и нижний регистр, и пробел и т. д., просто делать с ними разные вещи? – chux

+0

@chux Я не хочу принимать пустое пространство, я хочу обнаружить их и напечатать ошибку, когда они находятся на входе – SpeedGoat

ответ

0

Вы не сканируя всю строку. Вы получаете первого символа в ch, тогда вы получаете остальную часть строки в buff (более или менее), а затем, если ch является строчным символом, ваша программа будет печатать «Без пробелов» и потому, что вы больше никогда не меняете ch.

+2

Пара других примечаний: fgetc возвращает int, а не char. И islower может ошибочно ошибиться при передаче char, если char подписан (как на некоторых компьютерных архитектурах), а char имеет самый старший бит 0x80. – Waxrat

+0

Как сканировать всю строку? используя: while (fgetc (stdin)! = '' || fgetc (stdin)! = EOF)? Также есть альтернатива islower? – SpeedGoat

+0

Вы хотите сохранить символ, возвращенный из fgetc, чтобы вы могли сравнить его несколько раз. Например: while ((ch = fgetc (stdin))! = EOF && ch == '') ... islower отлично, просто убедитесь, что вы объявляете ch как int вместо char. islower действителен для всех значений, возвращаемых из fgetc. – Waxrat