2016-11-20 12 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'は 'char'ではなく' int'を返します。(http:// stackoverflow .com/q/8464030/995714)、EOFと文字コード0xFFが異なるため –

+0

"ユーザーから小文字しか受け付けないプログラムを作成したい" "空白があるときはいつでもエラーを出力します" - >だから、小文字とホワイトスペースの両方を "受け入れる"ことを望みます。 – chux

+0

@chux空白を受け入れたくないので、それらを検出して、入力時にエラーを出力したい – SpeedGoat

答えて

0

であなたの助けをいただき、ありがとうございます。最初の文字をchにしてから、残りの行をbuff(多かれ少なかれ)にして、chが小文字であれば、プログラムは "There are no spaces"を上書きしますもう一度chを変えることはないからです。

+2

その他の注意点:fgetcはcharではなくintを返します。そして、charが(いくつかのコンピュータアーキテクチャのように)署名され、charが最上位ビット0x80を設定している場合、charを渡すと、islowerは誤動作する可能性があります。 – Waxrat

+0

文字列全体をスキャンするにはどうすればよいですか? while(fgetc(stdin)!= '' || fgetc(stdin)!= EOF)?また、islowerに代わる方法はありますか? – SpeedGoat

+0

fgetcから返された文字を保存して、数回比較できるようにします。同様に:while((ch = fgetc(stdin))!= EOF && ch == '))... islowerは問題ありません。charをcharの代わりにintとして宣言してください。 islowerはfgetcから返されたすべての値に対して有効です。 – Waxrat

関連する問題