2016-11-20 5 views
1

Je souhaite créer un programme qui accepte uniquement les caractères minuscules de l'utilisateur. Et je le veux pour imprimer une erreur chaque fois qu'il y a un espace, une lettre majuscule dans l'entrée ou n'importe quel caractère à côté de l'alphabet. Mais mon code se comporte d'une manière inattendue, je ne sais pas pourquoi. Le message d'erreur est imprimé uniquement si un espace ou une lettre majuscule est le premier caractère entré dans l'entrée. Comment est-ce possible même si je scanne toute la chaîne avec fgetc à la recherche d'un espace?Détecter les espaces blancs dans l'entrée

#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"); 
} 

Merci pour votre aide à l'avance

+0

[pour vérifier l'utilisation des espaces 'isspace'] (http://stackoverflow.com/q/15326729/995714), et [' fgets' renvoie 'int', pas' char'] (http: // stackoverflow .com/q/8464030/995714), parce que EOF et le code de caractère 0xFF sont différents –

+0

"Je veux faire un programme qui n'accepte que les caractères minuscules de l'utilisateur." et "imprime une erreur chaque fois qu'il y a un espace ..." - >> Donc vous voulez "accepter" à la fois les minuscules et les espaces blancs, etc., faire juste des choses différentes avec eux? – chux

+0

@chux Je ne veux pas accepter les espaces, je veux les détecter et imprimer l'erreur quand ils sont dans l'entrée – SpeedGoat

Répondre

0

Vous n'êtes pas numériser toute la chaîne. Vous obtenez le premier caractère dans ch, alors vous obtenez le reste de la ligne dans buff (plus ou moins), et puis si ch était un caractère minuscule, votre programme affichera "Il n'y a pas d'espace" sur et plus parce que vous ne changez plus jamais ch.

+2

Quelques autres notes: fgetc renvoie un int, pas un caractère. Et islower peut mal se comporter lors du passage de char si le char est signé (comme sur certaines architectures d'ordinateur) et que le char a le bit le plus significatif 0x80. – Waxrat

+0

Comment numériser toute la chaîne? en utilisant: while (fgetc (stdin)! = '' || fgetc (stdin)! = EOF)? Y a-t-il aussi une alternative à islower? – SpeedGoat

+0

Vous voudrez sauvegarder le caractère retourné par fgetc pour pouvoir le comparer plusieurs fois. Comme: while ((ch = fgetc (stdin))! = EOF && ch == '') ... islower est bien, assurez-vous de déclarer ch comme int au lieu de char. islower est valide pour toutes les valeurs renvoyées par fgetc. – Waxrat