プログラムをできるだけそのままにして、正しく書き直すと、
C
1#include <stdio.h>
2#include <ctype.h>
3
4int main(){
5 int pass; //入力してもらうパスワード
6
7 while (1){
8 puts("数値パスワードを入力してください。");
9 pass = getchar();
10 if(pass==EOF){
11 puts("入力が終わりました。");
12 break;
13 }
14 if (isdigit(pass)){
15 puts("パスワードを設定しました。");
16 break;
17 }
18 else{
19 puts("パスワードは数値のみです。");
20 }
21 }
22
23 if(pass!=EOF){
24 printf("パスワードは「%c」\n",pass);
25 }
26 return 0;
27}
パスワードは数字一文字限定と言うことでいいのでしょうか?
getchar()
は文字単位の入力で、改行文字も1文字として扱いますので、入力した文字数より1回多くループすることになります。
入力1行に対して、エラーメッセージ1回にしたければ、
(案1)行末まで読み飛ばすか、
C
1#include <stdio.h>
2#include <ctype.h>
3
4int main(){
5 int pass; //入力してもらうパスワード
6
7 while (1){
8 puts("数字1文字をパスワードとして入力してください。");
9 pass = getchar();
10 if(pass==EOF){
11 puts("入力が終わりました。");
12 break;
13 }
14 while(pass!='\n'){
15 pass = getchar();
16 }
17
18 if (isdigit(pass)){
19 puts("パスワードを設定しました。");
20 break;
21 }
22 else{
23 puts("パスワードは数字1文字のみです。");
24
25 while(pass!='\n'){
26 pass = getchar();
27 }
28 }
29 }
30
31 if(pass!=EOF){
32 printf("パスワードは「%c」\n",pass);
33 }
34
35 return 0;
36}
(案2) 1文字入力(getchar()
)でなく、行入力(fgets()
)をするのがいいです。
C
1#include <stdio.h>
2#include <ctype.h>
3
4int main(){
5 int pass; //入力してもらうパスワード
6 char line[100];
7
8 while (1){
9 puts("数字1文字をパスワードとして入力してください。");
10 if(!fgets(line,sizeof(line),stdin)){
11 puts("入力が終わりました。");
12 pass = EOF;
13 break;
14 }
15 if (isdigit(line[0])&&line[1]=='\n'){
16 puts("パスワードを設定しました。");
17 pass = line[0];
18 break;
19 }
20 else{
21 puts("パスワードは数字1文字のみです。");
22 }
23 }
24
25 if(pass!=EOF){
26 printf("パスワードは「%c」\n",pass);
27 }
28
29 return 0;
30}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。