#include
int main(){
int y=0;
int c;
int m=0;
int g;
printf("西暦を入力してください\n");
while((c=getchar()) !='\n'){
if(c>='0' && c=1900 && y='0' && g=1 && m<=12){
printf("%d\n",m);
}
return 0;
}
この問題でいまこの中にあるものだけで、文字コードから年号を入力するプログラムをつくってるのですが数字意外の文字が入力されたらまた最初の入力に戻る繰り返し分にし、Enterが入力されたらgetcharをやめて全て数字だったときに1900〜2100の範囲内にはいっていなければ最初の入力に戻る繰り返し文をつくっています(T . T)
また空白空白1900空白空白Enterとかであればokで
空白1空白9空白0空白0Enterなどのいくつも数字がバラける場合は入力に戻るプログラミングを作りたいのですがどなたか教えていただけないですか(T . T)
よろしければ
RE: よろしければ
IdeoneではちゃんとEOFが返されるようです。せんちゃ さんが書きました:末端までいけばEOFを返す仕様ですが、残念ながら標準入力では返されてなかったのでびっくりです。
https://ideone.com/jklGNJ
使用しているコンパイラ・環境は何ですか?
RE: よろしければ
失礼しました、こちらの調査が足りてなかったです。みけCAT さんが書きました:「(標準入力をリダイレクトしていなければ)キーボードの入力を受け付ける」というのは正しいと言っていいと思います。せんちゃ さんが書きました:標準入力から1文字取り出すのでキーボードの入力を受け付けると解釈しています。みけCAT さんが書きました: そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
やっていることはstdin指定のgetcをdefineで定義したものです。
「コンソールに出力するためのもの」なんていう話は聞いたことがありません。
Re: よろしければ
「計算で書く」とはどういうことですか?にょんた さんが書きました:statusつかわないで変数をおいて計算で書く方法ってありますか?^ ^
statusを使いたくないのなら、例えばzyoutaiという「変数をおけば」いいと思います。
Re: よろしければ
多分できると思いますが、具体的に何をしたいのかがよくわかりません。にょんた さんが書きました:変数の初期値を0として比較の動作をループさせることってできますか?^ ^
Re: よろしければ
とりあえず、構文解析の状態を変数に保持しない形で書き直してみました。にょんた さんが書きました:いまいちstatusの部分がわからなくて(T . T)
while(1) {
/* 最初の空白を読み飛ばす */
while((c=getchar())==' ' || c=='\t');
if(c=='\n')continue; /* 空白しかなければ入力をやり直す */
if(c==EOF)break; /* 入力の終わりなら抜ける */
/* 数値を読み込む */
if(c>='0' && c='0' && c=y*10+(c-'0')) {
/* オーバーフローの簡易検出 */
isValidNumber=0;
}
y=y*10+(c-'0');
}
if(!isValidNumber) {
/* 有効な整数ではなかったので、入力をやり直す */
if(c!='\n' && c!=EOF) {
while((c=getchar())!='\n' && c!=EOF); /* この行の最後まで読み飛ばす */
}
continue;
}
} else {
/* 数字ではない不正な文字なので、入力をやり直す */
while((c=getchar())!='\n' && c!=EOF); /* この行の最後まで読み飛ばす */
continue;
}
/* 数値の後の空白を読み込む */
if(c!='\n' && c!=EOF) {
int isValidInput=1;
/* 不正な(空白ではない)文字が無いかチェックする */
if(c!=' ' && c!='\t')isValidInput=0;
while((c=getchar())!='\n' && c!=EOF) {
if(c!=' ' && c!='\t')isValidInput=0;
}
if(!isValidInput)continue; /* 不正な文字があったので、入力をやり直す */
}
/* 入力された整数が範囲内なら、ループを抜ける */
if(y>=1900 && y<=2100) {
break;
}
}
Re: よろしければ
みなさん昨日はありがとうございました!
助かりました!(T . T)
なんかシンプルにかくとwhile文を4つでかけるらしくて
一つ目→スペースがまず0個以上あるか
2つ目→数字が0個以上あるか
3つ目→数字のあとにスペースが0個以上あるか
4つ目→スペースのあと文字とか数字なのかEnterなのか
最後にif文1つだけで1900から2100の範囲内だったら出力でできるらしいのですがどなたかわかりますか?
助かりました!(T . T)
なんかシンプルにかくとwhile文を4つでかけるらしくて
一つ目→スペースがまず0個以上あるか
2つ目→数字が0個以上あるか
3つ目→数字のあとにスペースが0個以上あるか
4つ目→スペースのあと文字とか数字なのかEnterなのか
最後にif文1つだけで1900から2100の範囲内だったら出力でできるらしいのですがどなたかわかりますか?
Re: よろしければ
こんな感じでしょうか?にょんた さんが書きました:なんかシンプルにかくとwhile文を4つでかけるらしくて
一つ目→スペースがまず0個以上あるか
2つ目→数字が0個以上あるか
3つ目→数字のあとにスペースが0個以上あるか
4つ目→スペースのあと文字とか数字なのかEnterなのか
最後にif文1つだけで1900から2100の範囲内だったら出力でできるらしいのですがどなたかわかりますか?
while((c=getchar())==' ' || (ungetc(c,stdin),0));
while(c=getchar(),c>='0' && c=0&&(y=((y*10)/10==y?(y*10+c-'0'>=y?y*10+c-'0':-1):-1)),1):(ungetc(c,stdin),0));
while((c=getchar())==' ' || (ungetc(c,stdin),0));
while((c=getchar())=='\n'?0:((y=-1),c!=EOF));
if(y>=1900 && y<=2100)printf("%d\n",y);