ページ 1 / 1
西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 17:23
by ksk0629
元号表記の年と、元号を入力することで、西暦を表示するプログラムです。
コード:
#include <stdio.h>
main() {
/*変数宣言*/
int y;
char g;
/*必要な情報を入力*/
printf("input year of gengou : ");
scanf("%d", &y); //元号表記の年を入力
printf("input please h(heisei) or s(syowa) : ");
scanf("%s", &g); //先の入力が平成か昭和かを選ぶ
printf("%d\n", y);
/*西暦表記の出力*/
switch (g) {
/*大文字か小文字のsが入力されたとき*/
case 's' :
case 'S' :
y += 1924;
printf("%d\n", y);
break;
//[break] : 条件分岐の文から抜け出す
/*大文字か小文字のgが入力されたとき*/
case 'h' :
case 'H' :
y += 1988;
printf("%d\n", y);
break;
/*その他の文字が入力されたとき*/
default:
printf("I said -input please h or s!- Fuck you!!!\n");
}
}
このプログラムで
7
g
と入力しても
0
1924
と出力されます。
どうしてscanfでyに7を入れているのにyには0が入っているのでしょうか?
回答お待ちしております。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 17:36
by box
そもそも、
ksk0629 さんが書きました:
コード:
char g;
scanf("%s", &g); //先の入力が平成か昭和かを選ぶ
ここで変数の型と書式文字列の間でミスマッチがあります。
char型の変数に対する書式文字列が本当に"%s"でいいのかどうか、
確認してください。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 17:46
by ksk0629
boxさん
%cだとなぜか
7
を打ち込むだけで
gでも7が入力されて、更に意味が分からない動作をしたために%sにしました。
以下%cでの結果です
input year of gengou : 7
input please h(heisei) or s(syowa) : 7
I said -input please h or s!- Fuck you!!!
入力したのは最初の7だけです。
下の7は勝手に入力されました。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 17:55
by かずま
ksk0629 さんが書きました:%cだとなぜか
7
を打ち込むだけで
gでも7が入力されて、更に意味が分からない動作をしたために%sにしました。
スペースを入れて、
にしてみてください。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 18:10
by ksk0629
かずまさん
大好きです。愛しています。
ありがとうございました。
そういえば昔1文字の%cでは空けろといわれた気がします。
本当にありがとうございました。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 18:11
by ksk0629
解決忘れてました。
連投すいません。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月06日(土) 18:52
by かずま
ksk0629 さんが書きました:そういえば昔1文字の%cでは空けろといわれた気がします。
なぜ、スペースが必要かを説明しないと、解決とはいえないと思います。
説明をお願いします。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月07日(日) 02:54
by ksk0629
かずま さんが書きました:ksk0629 さんが書きました:そういえば昔1文字の%cでは空けろといわれた気がします。
なぜ、スペースが必要かを説明しないと、解決とはいえないと思います。
説明をお願いします。
すんません。
解決押したんで見てませんでしたwww
エンターで改行文字が放出されるから、ではありませんか?
あと本当の解決を追求するなら何故スペースが必要なのかだけでなく
%sだと何故yに0が代入されているのかを理解したらではないですか?
そちらは確かに解決してないので何故そうなるのか、もしもかずまさんが分かれば解説お願いします。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月07日(日) 09:24
by みけCAT
ksk0629 さんが書きました:あと本当の解決を追求するなら何故スペースが必要なのかだけでなく
%sだと何故yに0が代入されているのかを理解したらではないですか?
そちらは確かに解決してないので何故そうなるのか、もしもかずまさんが分かれば解説お願いします。
入力したgの後のnull character (全てのビットが0)が
たまたま変数gの直後に配置されていた変数yの1バイト目に書き込まれ、
入力した7は1バイトで表せる(2バイト目以降が全て0)値であり、さらに実行したマシンがリトルエンディアンを採用していたため、
変数yの値が0になったのでしょう。
を入力するとどうなりますか?
ではどうなりますか?
オフトピック
ksk0629 さんが書きました:もしもかずまさんが分かれば解説お願いします。
かずまさんが分からなければ解説するなとは言ってない。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月07日(日) 09:28
by みけCAT
ksk0629 さんが書きました:下の7は勝手に入力されました。
%cで改行文字を読み込む→その下のprintf("%d\n", y);でyに読み込んだ7が出力される ですね。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月07日(日) 09:33
by みけCAT
%sのまま改善してみました。
コード:
#include <stdio.h>
int main(void) { /* main関数の宣言を標準のものにする */
/*変数宣言*/
int y;
char g[2]; /* 1文字の文字列を読み込めるようにする */
/*必要な情報を入力*/
printf("input year of gengou : ");
scanf("%d", &y); //元号表記の年を入力
printf("input please h(heisei) or s(syowa) : ");
/* バッファオーバーランしないように最大文字数を指定し、gの型の変更に合わせて&を外す */
scanf("%1s", g); //先の入力が平成か昭和かを選ぶ
printf("%d\n", y);
/*西暦表記の出力*/
switch (g[0]) { /* 読み込んだ文字列の最初の文字を見る */
/*大文字か小文字のsが入力されたとき*/
case 's' :
case 'S' :
y += 1924;
printf("%d\n", y);
break;
//[break] : 条件分岐の文から抜け出す
/*大文字か小文字のgが入力されたとき*/
case 'h' :
case 'H' :
y += 1988;
printf("%d\n", y);
break;
/*その他の文字が入力されたとき*/
default:
printf("I said -input please h or s!- Fuck you!!!\n");
}
return 0; /* 返り値をきちんと書く */
}
scanfの戻り値を見てデータを読み込めたかチェックするようにすると、さらに良くなるでしょう。
Re: 西暦表示プログラム scanfについて
Posted: 2016年2月07日(日) 17:42
by ksk0629
みけCATさん
詳しい回答ありがとうございます。
正直なところを申しますと、未だC言語は本のサンプルプログラムをそのまま写して勉強しているだけなのでほぼ何を言っているのか現状では分かりませんが、しっかりと一つづつ調べて理解に励みたいと思います。
またみけCATさんに手直ししていただいたプログラムも保存しておき、勉強に使っていく所存です。
本当にありがとうございました。