#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: よろしければ
あぁ、すいません。日記か掲示板って書いたのが悪かったですね。
本当は掲示板に書くのがベストなのですよね。
僕の責任です。
まずはコードタグを使うと良いですよ。
本当は掲示板に書くのがベストなのですよね。
僕の責任です。
まずはコードタグを使うと良いですよ。
最後に編集したユーザー せんちゃ on 2014年4月23日(水) 23:03 [ 編集 2 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
Re: よろしければ
こういうのは、質問掲示板でどうぞ。
本当に日記、単なる報告、雑談などが日記の役割だと思います。
本当に日記、単なる報告、雑談などが日記の役割だと思います。
Re: よろしければ
「いまこの中にあるものだけ」という縛りの内容がよくわからないですが、
とりあえず西暦の入力部分を実装してみました。
月も同様にできるはずです。
とりあえず西暦の入力部分を実装してみました。
月も同様にできるはずです。
while(1) {
int status=0; /* 0:数字の前 1:数字 2:数字の後 3:不正 */
y=0;
while((c=getchar())!='\n' && c!=EOF) {
if(c==' ' || c=='\t') {
/* 空白 */
if(status==1)status=2;
} else if(c>='0' && cy*10+(c-'0'))status=3; /* オーバーフローの簡易検出 */
y=y*10+(c-'0');
}
} else {
/* その他の文字 */
status=3;
}
}
if(status==1 || status==2) {
/* 有効な数値が入力されたら */
if(y>=1900 && y<=2100)break; /* 数値が範囲内ならループを抜ける */
}
}
最後に編集したユーザー みけCAT on 2014年4月23日(水) 23:09 [ 編集 1 回目 ]
理由: EOFも検出するようにしました。
理由: EOFも検出するようにしました。
RE: よろしければ
条件的にはまず空白(タブ含める?)か数値(0位上9以下)の文字コードであれば戻らない、そうでなければ戻るにょんた さんが書きました: 空白空白1900空白空白Enterとかであればokで
空白1空白9空白0空白0Enterなどのいくつも数字がバラける場合は入力に戻るプログラミングを作りたいのですがどなたか教えていただけないですか(T . T)
というように考えてみるとこの手のコードは良いと思います。
まずgetcharはキーボード入力をコンソールに出力するためのものです。
入力された文字コードを1文字ずつ取り出します。
なので西暦を入力してもらった後に入力文字を1文字ずつ確認して空白なら無視、数字ならやりたい処理を、それ意外なら再度入力し直し
というシーケンスを作ってみるといいと思います。
あとgetcharは何もないときはEOFを返すので'\n'ではなくEOFで見ると良いかもしれません
すいません、今試してみたらなぜかEOFを返してなかったので\nのほうが良さそうですね。。。
(ファイルの終端を読み取った時にEOF返すって関数辞典に書いてあったのにぃぃーー!!)
最後に編集したユーザー せんちゃ on 2014年4月23日(水) 23:36 [ 編集 1 回目 ]
RE: よろしければ
そのような機能は聞いたことがありませんが…出典はありますか?せんちゃ さんが書きました:まずgetcharはキーボード入力をコンソールに出力するためのものです。
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
「何もないとき」とはどのような時ですか?せんちゃ さんが書きました:あとgetcharは何もないときはEOFを返すので'\n'ではなくEOFで見ると良いかもしれません
今回の場合、(特殊な端末を利用しているのでなければ?)EOFかどうか見るだけでは自然な動作にならないと思います。
基本的には、その名の通りステータスを表すのに使うのがいいと思います。にょんた さんが書きました:statusというのがよくわからないのですがどの様なとき使うのですか?(T . T)
この場合、今解析したい文字列のどの部分に相当する入力まで読み込んだか、という情報を保持しています。
RE: よろしければ
標準入力から1文字取り出すのでキーボードの入力を受け付けると解釈しています。みけCAT さんが書きました: そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
やっていることはstdin指定のgetcをdefineで定義したものです。
入力の末端までいったときのことです。みけCAT さんが書きました: 「何もないとき」とはどのような時ですか?
今回の場合、(特殊な端末を利用しているのでなければ?)EOFかどうか見るだけでは自然な動作にならないと思います。
末端までいけばEOFを返す仕様ですが、残念ながら標準入力では返されてなかったのでびっくりです。
RE: よろしければ
ファイルの終端はファイルの終端です。せんちゃ さんが書きました:すいません、今試してみたらなぜかEOFを返してなかったので\nのほうが良さそうですね。。。
(ファイルの終端を読み取った時にEOF返すって関数辞典に書いてあったのにぃぃーー!!)
標準入力がキーボードである場合、例えば、
WindowsならCtrl+Z、LinuxやMacならCtrl+Dなどで入力の終了を通知すると、EOFが読み込まれるだろうと思います。
RE: よろしければ
「(標準入力をリダイレクトしていなければ)キーボードの入力を受け付ける」というのは正しいと言っていいと思います。せんちゃ さんが書きました:標準入力から1文字取り出すのでキーボードの入力を受け付けると解釈しています。みけCAT さんが書きました: そのような機能は聞いたことがありませんが…出典はありますか?
そういえばC言語っぽいコードですが、C言語だとは明示されていませんでしたね。
やっていることはstdin指定のgetcをdefineで定義したものです。
「コンソールに出力するためのもの」なんていう話は聞いたことがありません。