無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
uwlover

無題

#1

投稿記事 by uwlover » 16年前

初めまして、ゲーム制作をしたくなって最近C言語(とC++)を勉強し始めた者です。
その勉強の過程でget関数とput関数というのが出てきました。これらは文字の入出力を扱う関数であり、
文字列ではないですよね?ですが、
#include <iostream>
#include <cctype>
using namespace std;

int main()
{
char ch;

while(cin.get(ch))
cout.put(ch);

return 0;
}
このように記述した場合、get()は文字列を(例えば1回の入力でabc)入力できるようになっていますし、put()
もその文字列を出力できるようになっています。色々調べたところ、「1回の入力で入力した文字数だけの
ループが起こっている」ということまでは分かりました。そして、その文字列が1回のループごとに1文字ずつ
処理されていくということも。しかし、ループするたびにget()を使って条件判定するわけですよね?すると
最初に入力した文字列がループしてきたときにまたget()でwhileの条件判定をすることになるわけですから、
毎ループごとに入力を促されることにならないでしょうか?

uwlover

Re:get関数とput関数

#2

投稿記事 by uwlover » 16年前

あ、タイトルを入れ忘れてました…すいません

non

Re:get関数とput関数

#3

投稿記事 by non » 16年前

標準入力(キーボード)から入力された文字は、入力バッファというところに溜まります。
入力バッファにはエンターが押されたとき、またはバッファーが一杯になるまで入力が続
きます。getという関数は、入力バッファから文字を取り出す関数ですから、通常はエンター
が押されないと取り出されないことになります。そして、エンターを押された瞬間に、続けて
文字が取り出されては、putされていきます。

試しに、
while(cin.get(ch)) を
while((ch=getche())!='q') に変えてみましょう。
conio.hが必要です。

uwlover

Re:get関数とput関数

#4

投稿記事 by uwlover » 16年前

>>nonさん

その記述に変えてみると、私が本来while(cin.get(ch))の記述で起こるはずだと思っている通りになりました。
(ただし文字を入れた瞬間、エンターを押さないうちに条件判定するようですが)

つまり、abcと書いているうちはあくまで入力バッファという場所にそのデータが一時保管されていて、
エンターを押すまではget関数にそのデータは伝わらない。入力バッファにデータがいくのだから文字列入力は
可能である。そして一度エンターを押すとget関数が入力バッファのデータを一文字ずつ処理してそれを
put関数に渡してディスプレイに表示させる。そしてput関数が仕事したらループで戻りまたget関数が残りの
データをまた処理して…という感じでしょうか。
しかしそうなると、キーボード入力を受け付けるというget関数の機能はどうなるんでしょうか?入力バッファ
にデータが残っているうちはその機能が実行されない、と考えればいいのですか?

non

Re:get関数とput関数

#5

投稿記事 by non » 16年前

入力バッファに文字が溜まっている間は、getは入力バッファから文字を取り出します。
しかし、入力バッファが空の場合は、標準入力からの入力を待ちます。標準入力から
入力バッファへの入力は行単位で(エンターが押されるまで)行われます。
なお、getcheはバッファを使わないので、キーボードを押したらすぐに取り込まれて
putされます。


>入力バッファにデータがいくのだから文字列入力は可能である。
文字列?連続した文字の入力というのであればYESです。

uwlover

Re:get関数とput関数

#6

投稿記事 by uwlover » 16年前

なるほど、つまりget関数は入力バッファにデータがないときはキーボードからデータが送られてくるのを待つ
ということですね。

>文字列?連続した文字の入力というのであればYESです。
はい、そういうことです。一度にabcと入力してからエンター入力ってことが出来る、という意味です。

やっとget関数とput関数の意味を理解することができました。nonさんがここまで深く突っ込んだ話をして
くださらなかったらとても理解できるなんてことはなかったに違いないですね。自分の持っている本を改めて
読んでみましたがやはり説明不足としか言いようがないです…ともあれ、どうもありがとうございました。

non

Re:get関数とput関数

#7

投稿記事 by non » 16年前

cin(ストリーム)ってのが間にありますから、実はもっと複雑です。
フラッシュが必要になったときに、また勉強してください。

閉鎖

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