はじめまして。
現在c++を勉強し始めて1週間の初心者です。
fflush(stdin)について質問です。下記のプログラムで小文字入力したアルファベット1文字を大文字に変換して出力しています。方法(1)ではgetchar()関数とputchar()関数を使用していますがどうしてこの場合にはfflush(stdin)が必要となり、方法(2)のprintf()関数とscanf()関数を使用した場合はfflush(stdin)が必要ないのでしょうか?どなたか私のような初心者でも分かるように詳しく説明してもらいたいです。
何故かプログラムを書いているとprintf()とscanf()がよく混乱します。原因として、printf()を先に書く場合と、scanf()を先に書く場合が有るからだと思っているのですが、まだよく理屈の理解ができません。なので出来ればこれらの関数についても基本的な概念を教えていただきたいです。それと方法(2)では何故最後にscanf(%c):が無くても良いのかも良く理解できません。
どなたか是非とも回答宜しくお願いします。
#include <stdio>
main void()
{
方法(1)
printf("\n文字を1つ入力してください:");
fflush(stdin);
char ch=getchar();
ch=ch-32;
putchar(ch);
方法(2)
printf("\n文字を1つ入力してください:")
//fflush(stdin);必要なし???
char ch;
scanf("%c",&ch);
ch=ch-32;
printf("%c",ch);
//scanf(%c):???
}
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
おそらく、fflush(stdin)ではなくfflush(stdout)ですね。
> printf("\n文字を1つ入力してください:");
とした場合、標準出力が行バッファリングまたはフルバッファリングの場合、getcharで読み込むを始める時点では文字列が出力し切れていない可能性があります。
いちいちfflush(stdout)を書くのが面倒であれば、プログラムの始めに、
setbuf(stdout, NULL);
としておくのも一つの手です。
ちなみに、fflush(stdin)とした場合の動作は未定義です。
必ずしも禁止ではありませんが、移植性は損なわれます。
参考URL:http://www.kijineko.co.jp/tech/superstitions/ffl …
回答ありがとうございます。fflush(stdin)以外にもsetbuf(stdout.NULL)って方法もあるんですね。とても勉強になりました。ありがとうございました。
No.5
- 回答日時:
既に他の方も指摘していますが、
fflushについては、出力ストリーム以外の
ファイルディスクリプタに対しては使用してはいけません。
「不要かどうかではなく、禁止です。」
>どなたか私のような初心者でも分かるように詳しく説明して
噛み砕くことは必ずしもいい結果をもたらすとは思えないので、
特にその人の思い込みや普段の使い方から間違った説明を
しかねないと思うので、以下のHPで自力で調べて、
「ここの意味が分からない」ということろを改めて
質問されてはいかがでしょう?
# 特にCの規格書を1度も読んだ事がない人は、
# 一読することをお勧めします。
http://www.bohyoh.com/CandCPP/C/Library/index.html
> 方法(2)では何故最後にscanf(%c):が無くても良いのか
もともとの方法(1)に該当のscanfに対応する処理が
見あたりませんが。。。?
回答ありがとうございます。不要ではなく禁止だったんですね。分かりました。添付して頂いたサイト、今後の参考にさせて頂きます。ありがとうございました。
No.4
- 回答日時:
fflush(stdin);も、scanf(%c):も、このプログラムには不要です。
おそらく、どこかのサンプルプログラムを参考にしたのだと思いますが、そのサンプルプログラムのほうでは必要だっただけでしょう。
また、ストリーム入出力は奥が深いです。ちゃんと理解しようと思ったら、配列やらポインタやらOSの仕組みやら、いろいろな知識が必要です。
現段階で理解するのは無理かと思います。いまのところはこんなもんだと覚えておいて、いろいろは知識が身についてから、あらためて考え直すほうがいいとおもいます。
回答ありがとうございます。ストリームは奥が深いんですね。今はとりあいず貴方がおっしゃるようにこんなもんだと覚えておいて、printf()の場合はfflush.stdinは必要ないと暗記することにします。ありがとうございました。
No.3
- 回答日時:
うん, 私も fflush は不要だと思う. ちなみに (1) で fflush を入れなかったらどんな動作になりますか?
以下おまけの突っ込み.
1. #include <stdio> じゃなくて #include <stdio.h>
2. 「小文字を大文字に変換する」ならそんな方法ではなく ctype.h を #include した上で tolower を使うべし.
3. 実は fflush は出力ストリームに対してのみ使うことができます. 従って (入力ストリームである) stdin に対して fflush を実行したときの結果は未定義となっています. 要するに「fflush(stdin); はやってはいけない」ということになります... ひょっとして fflush(stdout) ってしたかった?
回答ありがとうございます。小文字を大文字に変換するときに<ctype.h を #include した上で tolower と実行?現在の知識では正直理解できませんが少し調べてみます。ありがとうございました。
No.2
- 回答日時:
方法(1)で、fflush(stdin)は不要のはずですが、無いとどうなりますか?
また、scanfという関数は使い方が非常に難しいので、初心者は絶対に使ってはいけません。とりあえずその存在を忘れた方が良いです。
同じようなことをしたい場合は、
char buf[200];
fgets(stdin,sizeof buf,buf);
sscanf(buf,"・・・・・",・・・・・);
のようにfgets+sscanfの組み合わせで使います。
あと、getchar()の値はint型なので、char chでなく int ch とします。
この回答への補足
回答ありがとうございます。getchar()の値はint型というのは某サイトにも同じことが書かれていたのを見たことがあります。しかしchar chでも正常に起動すのですが何故でしょうか?私はvs2005のc++を使っています。
補足日時:2009/02/11 07:37お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
プログラムについての質問です。 fflush(stdout)はいったいどのような時に使われているので
C言語・C++・C#
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
getchar()について 教えてください。
C言語・C++・C#
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
2進数の1の数を数える問題
-
cout関数を使っているのですが...
-
WindowsでEOF
-
至急教えてください!プログラ...
-
Eclipseでコマンドラインを入力...
-
scanf が無視されます
-
gets_sがうまく動かない
-
C言語(構造体)
-
VisualStudio2019のコードアナ...
-
コマンドプロンプトからのEOFの...
-
エクセル¥マクロで対話形式の...
-
コマンドライン上で確定した文...
-
C言語でscanfを用いた入力
-
漢字のソートについて
-
あるキーを押したら強制終了さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
cout関数を使っているのですが...
-
ワードで文字を入力する時の変...
-
VB.NETで16進数+16進数や16進...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
入力候補を表示させるには・・・?
-
getchar()について 教えてくだ...
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
Userformの入力順序をタブオー...
-
コマンドプロンプトからのEOFの...
-
VisualStudio2019のコードアナ...
-
WindowsでEOF
-
"gets"は危険なのでしょうか?
おすすめ情報