2017-09-09 4 views
0

J'écris un programme pour valider un nom d'utilisateur saisi par l'utilisateur. Pour les besoins de ce projet, nous devons autoriser les lettres alphabétiques (majuscules ou minuscules), les chiffres ou les traits de soulignement, mais pas d'espaces ni d'autres signes de ponctuation. Il doit également comprendre entre 5 et 10 caractères au total. Je crois que mon problème est avec getchar() car je sais qu'il ne peut contenir qu'un caractère à la fois, mais je ne suis pas entièrement sûr de la meilleure façon de le réparer. Actuellement, lorsque je cours mon code, il ne revient que comme invalide. Ai-je besoin de changer de boucle ou de faire des ajustements? Ou y a-t-il un problème avec ma déclaration if?Travailler avec getchar() dans C

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

int main(void) 
{ 


    int ch; 
    int len = 0; 


    printf("Enter the username: "); //prompt user to enter a username 
    ch = getchar(); 


    while (ch != '\n') //while loop checking for length of username 
    { 
     len++; 
     ch = getchar(); 
    } 

    if(isspace(ch) || ispunct(ch) || len > 10 || len < 5){ 

      printf("invalid input."); 
    } 

    else{ 
    printf("valid input."); 
    } 

    return 0; 

} 
+2

Vous devez vérifier le type de caractère dans la boucle. – BLUEPIXY

+0

Similaires [question] (https://stackoverflow.com/questions/46107545/c-language-cant-check-getchar-is-alphabet-or-digit) – BLUEPIXY

Répondre

1

Le problème est sur cette fonction: isspace(ch). Il renvoie une valeur non nulle (true) si le caractère est un espace blanc. espaces blancs standard sont

' ' (0x20) space (SPC) 
'\t' (0x09) horizontal tab (TAB) 
'\n' (0x0a) newline (LF) 
'\v' (0x0b) vertical tab (VT) 
'\f' (0x0c) feed (FF) 
'\r' (0x0d) carriage return (CR) 

Depuis la dernière action que vous prenez est en appuyant sur Entrée, le dernier caractère sera un saut de ligne ou de retour chariot en fonction du système d'exploitation (« \ r \ n », « \ n » ou " \ r ').

Je crois que vous aviez l'intention de vérifier si le nom a un espace entre les caractères. La façon dont vous le faites, vous vérifiez seulement le dernier. Vous pouvez ajouter tous les caractères à un tampon et le vérifier plus tard, ou modifier votre condition initiale pour vérifier les caractères invalides.

EDIT Comme il semble que vous ne parvenez toujours pas des commentaires, j'ai décidé d'ajouter une solution ici:

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

int main(void) 
{ 
    int ch; 
    int len = 0; 

    printf("Enter the username: "); //prompt user to enter a username 
    ch = getchar(); 


    while (!isspace(ch) && !ispunct(ch)) //while loop checking for length of username. While it's not(note the exclamation mark) a whitespace, or punctuation, it keeps going(newline is considered a whitespace, so it's covered by the loop). 
    { 
     len++; 
     ch = getchar(); 
    } 

    if (ch == '\n' && len <= 10 && len >= 5) {//if it found the newline char(considering the newline is \n), it means it went till the end without finding other whitespace or punctuation. If the lenght is also correct,then the username is valid 
     printf("valid input."); 
    } 
    else {//if the loop stopped because it found a space or puncuation, or if the length is not correct, then the input is invalid 
     printf("invalid input."); 
    } 

    return 0; 
} 
+0

Ok. Je pensais que le problème était peut-être que je vérifiais seulement le personnage final, alors je suis content d'apprendre que je suis au moins sur la bonne voie. De quoi aurais-je besoin pour changer ma boucle while? J'essayais d'ajouter le 'isspace (ch) || ispunct (ch) 'à la condition, Mais alors je me suis rendu compte que cela ne dérangerait pas du tout la boucle du tout, car il ne répond pas aux conditions. –

+0

Ok donc j'ai enlevé la fonction isspace (ch) complètement et ça semble fonctionner (même en détectant des espaces .. quoique je ne sois pas sûr de comment peut-être parce que j'ai ajouté! = EOF? Quoi qu'il en soit j'ai quitté l'ispunct (ch) et il est encore accepté la ponctuation ... est-ce la même question comment il vérifie seulement le dernier caractère? –

+0

Ok j'ai édité la réponse avec une solution possible, j'espère que cela aide – savram