西暦表示プログラム scanfについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ksk0629
記事: 16
登録日時: 10年前

西暦表示プログラム scanfについて

#1

投稿記事 by ksk0629 » 9年前

元号表記の年と、元号を入力することで、西暦を表示するプログラムです。

コード:

 
#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が入っているのでしょうか?
回答お待ちしております。

box
記事: 2002
登録日時: 14年前

Re: 西暦表示プログラム scanfについて

#2

投稿記事 by box » 9年前

そもそも、
ksk0629 さんが書きました:

コード:

  char g;
  scanf("%s", &g); //先の入力が平成か昭和かを選ぶ                               
ここで変数の型と書式文字列の間でミスマッチがあります。
char型の変数に対する書式文字列が本当に"%s"でいいのかどうか、
確認してください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ksk0629
記事: 16
登録日時: 10年前

Re: 西暦表示プログラム scanfについて

#3

投稿記事 by ksk0629 » 9年前

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について

#4

投稿記事 by かずま » 9年前

ksk0629 さんが書きました:%cだとなぜか
7
を打ち込むだけで
gでも7が入力されて、更に意味が分からない動作をしたために%sにしました。
スペースを入れて、

コード:

" %c"
にしてみてください。

ksk0629
記事: 16
登録日時: 10年前

Re: 西暦表示プログラム scanfについて

#5

投稿記事 by ksk0629 » 9年前

かずまさん
大好きです。愛しています。
ありがとうございました。
そういえば昔1文字の%cでは空けろといわれた気がします。
本当にありがとうございました。

ksk0629
記事: 16
登録日時: 10年前

Re: 西暦表示プログラム scanfについて

#6

投稿記事 by ksk0629 » 9年前

解決忘れてました。
連投すいません。

かずま

Re: 西暦表示プログラム scanfについて

#7

投稿記事 by かずま » 9年前

ksk0629 さんが書きました:そういえば昔1文字の%cでは空けろといわれた気がします。
なぜ、スペースが必要かを説明しないと、解決とはいえないと思います。
説明をお願いします。

ksk0629
記事: 16
登録日時: 10年前

Re: 西暦表示プログラム scanfについて

#8

投稿記事 by ksk0629 » 9年前

かずま さんが書きました:
ksk0629 さんが書きました:そういえば昔1文字の%cでは空けろといわれた気がします。
なぜ、スペースが必要かを説明しないと、解決とはいえないと思います。
説明をお願いします。
すんません。
解決押したんで見てませんでしたwww
エンターで改行文字が放出されるから、ではありませんか?

あと本当の解決を追求するなら何故スペースが必要なのかだけでなく
%sだと何故yに0が代入されているのかを理解したらではないですか?

そちらは確かに解決してないので何故そうなるのか、もしもかずまさんが分かれば解説お願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 西暦表示プログラム scanfについて

#9

投稿記事 by みけCAT » 9年前

ksk0629 さんが書きました:あと本当の解決を追求するなら何故スペースが必要なのかだけでなく
%sだと何故yに0が代入されているのかを理解したらではないですか?

そちらは確かに解決してないので何故そうなるのか、もしもかずまさんが分かれば解説お願いします。
入力したgの後のnull character (全てのビットが0)がたまたま変数gの直後に配置されていた変数yの1バイト目に書き込まれ、
入力した7は1バイトで表せる(2バイト目以降が全て0)値であり、さらに実行したマシンがリトルエンディアンを採用していたため、
変数yの値が0になったのでしょう。

コード:

256
g
を入力するとどうなりますか?

コード:

600
g
ではどうなりますか?
オフトピック
ksk0629 さんが書きました:もしもかずまさんが分かれば解説お願いします。
かずまさんが分からなければ解説するなとは言ってない。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 西暦表示プログラム scanfについて

#10

投稿記事 by みけCAT » 9年前

ksk0629 さんが書きました:下の7は勝手に入力されました。
%cで改行文字を読み込む→その下のprintf("%d\n", y);でyに読み込んだ7が出力される ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 西暦表示プログラム scanfについて

#11

投稿記事 by みけCAT » 9年前

%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の戻り値を見てデータを読み込めたかチェックするようにすると、さらに良くなるでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ksk0629
記事: 16
登録日時: 10年前

Re: 西暦表示プログラム scanfについて

#12

投稿記事 by ksk0629 » 9年前

みけCATさん
詳しい回答ありがとうございます。
正直なところを申しますと、未だC言語は本のサンプルプログラムをそのまま写して勉強しているだけなのでほぼ何を言っているのか現状では分かりませんが、しっかりと一つづつ調べて理解に励みたいと思います。
またみけCATさんに手直ししていただいたプログラムも保存しておき、勉強に使っていく所存です。
本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る