2017-09-09 27 views
0

ユーザが入力したユーザ名を検証するプログラムを作成しています。このプロジェクトでは、英字(大文字または小文字)、数字または下線を使用できますが、スペースや句読点は使用できません。また、合計5〜10文字でなければなりません。 一度に1文字しか保持できないことがわかっているので、私の問題はgetchar()だと思いますが、それを修正する最良の方法は完全にはわかりません。現在、私は自分のコードを実行すると、無効なものとしてしか戻らない。ループを変更したり調整したりする必要がありますか?またはif文に問題がありますか?C言語のgetchar()の使用

#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

あなたがループ内で、文字の種類を確認する必要があります。 – BLUEPIXY

+0

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

答えて

1

この機能の問題は、isspace(ch)です。文字が空白の場合、ゼロ以外の値(真)を返します。 「標準あなたが取る最後のアクションを押しているので、ホワイトスペースが

' ' (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) 

入る、最後の文字が(OSによっては、改行やキャリッジリターンとなります「\ rを\ n」は、「\ n」のか\ r ')。

文字の間に名前にスペースがあるかどうかを確認することを考えました。あなたがやっているやり方で、あなたは最後のものだけをチェックします。 バッファにすべての文字を追加して後でチェックするか、初期のwhile条件を変更して無効な文字をチェックすることができます。

EDIT それはあなたがまだコメントからトラブルを抱えているようですので、私はここに可能な解決策を追加することにしました:

#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。私は問題は私が最終的なキャラクターをチェックしているだけかもしれないと思ったので、私は少なくとも正しいトラックにいると聞いてうれしいです。 whileループについて変更する必要があるのは何ですか?私は 'isspace(ch)||を追加しようとしていました。 ispunct(ch) 'を条件に当てはめることができますが、条件を満たしていないのでwhileループを気にしないことに気付きました。 –

+0

私はisspace(ch)関数を完全に削除しました。(スペースを検出したとしても...)それはまだ句読法で受け入れられています...これは最後の文字のみをチェックするのと同じ問題ですか? –

+0

いいえ解決策を使って解答を編集しました。それは助けてくれるでしょう – savram