
はじめまして。
現在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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
"scanf"でエンターで改行させな...
-
プログラミングの問題で、キー...
-
Eclipseコンソール表示を、リセ...
-
Yesならこっちへ、NOなら...
-
数字以外が入力されたらエラー...
-
scanfが2回使えない・・・?;
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
プログラミング初心者です。 Py...
-
入力する数字のサイズ制限について
-
C言語 for文をつかって記号を表...
-
"gets"は危険なのでしょうか?
-
コマンドプロンプトからのEOFの...
-
java初心者です。入力されたの...
-
switch文 defaultについて
-
scanf()の順番
-
C言語scanf_sで何故か2回入力に...
-
電卓の小数点
-
scanf が無視されます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報