独習C - 独習Cから始めよう(2) (pp.62-152)
一気に飛ばす
もう簡単な問題はやらない.けれど本文はしっかり読むことにする
どうやらgetchar()は改行されるまで読み込まないくせにラインバッファに改行文字を残したままにするらしい.
getche()という関数も用意されているらしいが,gccにはないみたい.
この部分を読んだときはほぅほぅ程度だったのだが,後々はまることに.
簡単な問題に飽きてきて,文字列部分でCらしいプログラミングができるようになったなと勘違い.
総合問題にあったハングマンプログラムをこりこりっと書いてみた.
うまく動かない.
getchar()がうまくいっていないことに気がつく.
原因は読み込むために改行を要しているくせにラインバッファに改行が残っていること.
次回にgetchar()が呼び出されたときに前回入力された改行文字が読み込まれてしまう.
ラインバッファを初期化する方法を調べるが,よくわからない.
他の読み込み関数を使って代替しようとするも思い通りの動作をしてくれない.
結局,
char input; input = getchar(); getchar(); /* 改行文字を読み捨て */
こうすればよいということに気がつくまでに一時間
もっとスマートな回避方法はあるのだろうが,今持っている知識でできることといえばこれくらいか...
久しぶりにハマった.
今日学んだこと
型の昇格(type promotion)に注意
float f; f = 10 / 3; printf("%f", f);
実はこの結果は3.0になる.10も3もint型なために演算結果が3になってしまうのだ.
10.0/3.0と書けばよい(片方でも大丈夫のはず)
ここらへんJava育ちのゆとりには厳しい...
charは1バイトの整数型
と思ってもよい.例えばgetchar()の返り値は実はint型.
けれど,入力されるのは文字なので上位ビットは無視してOK
ということでそのままchar型に代入しても大丈夫という寸法.