色々なサイトを参考にしたため、私自身も少々情報を整理し切れず混乱していますが、出来る限り何が分からないのか説明していきたいと思います(主にwikipediaのscanfの項目についての話です)
表現がおかしい所もあると思いますが、よろしくお願いします。
1.getchar()について。
まずgetcharはキーボード(標準入力)から一文字入力するというのは理解できています。
ユーザーが入力をするまでその先の処理には進まず、待機していると思うのですが、オーバーフローした際のバッファに残されてしまった文字を捨てるためにgetcharを用いて空読みをするという方法があったのですが、この際、
//ラインバッファ処理 while( 1 ){ c = getchar(); if( c == EOF || c == '\n' ){ break; } printf( "%c\n", c ); }といった具合にバッファを空にしていくのですが、何故getchar()で入力待ちが起きないのか? というのが疑問です。
バッファが空でない場合は入力待ちが起きず、空なら入力待ちが起きることを確認しているので「そういうものだ」と割り切ってしまえばそれまでなのですが、一応知っておきたいと思った次第です。
2.%*s
scanf()に関してなのですが、
scanf("%*s");
というものがどういった事をしているのかがよく分かりません。
scanf("%*c%c", c);
といった場合には、一文字目は無視され二文字目が変数cに代入されるというのは分かります。
ではそれが%*sになるとどうなるか、という点ですが確認した限りでは"文字が入力されたらそれ以降は無視"といった感じのような気がしました(数パターンの実行結果から予想しただけのものなので恐らく違うと思いますが。。。)
話がちょっとごちゃごちゃしてきそうなのでオーバーフローと%*sの関連性について述べると、例えば以下のような処理をした場合(色々省いています)、
while(1){ printf("メニューを選んでください(入力は数字で)\n"); printf("0:最初から 1:続きから 2:終了する\n"); scanf("%d", &select); getchar(); if(select == 0){ stone[3][4].flag=black; break; }ここで仮に"a"と入力しただけで、無限ループに入ってしまいます。
そこで、Wikipediaを参考に、
while(1){
printf("メニューを選んでください(入力は数字で)\n");
printf("0:最初から 1:続きから 2:終了する\n");
if ( b=scanf("%d", &select) != 1){
scanf("%*s");
printf("%d\n", select);
}
if(select == 0){
stone[3][4].flag=black;
break;
}
としてみたのですが、"6y"や"5t"といった「数字+文字」の入力をすると一回余分にループしてから入力待ちになる、という状態になります。そもそもまずscanf("%*s")がどういった処理なのかがよく分かっていないのでその点の解説あるいは参考になるページなどありましたらお教え頂けれると幸いです。
以上なのですが、正直まだまだ分からない所が多く、むしろどこが分からないのか分からないという状態なのでまだ質問事項が出てくるかもしれませんが、とりあえずまずはこの2つを解決したいと思います。
分かりにくい質問だとは思いますが、よろしくお願いします。
コンパイラ:BorlandC++ Compiler
開発環境:CPad for Borland C++Compiler
OS:Windows XP
追記:
int main(void){ char c[4]; int no=0; scanf("%s", c); scanf("%*s"); printf("%s\n", c); return (0); }・結果
dvgdlgm43
43e
dvgdlgm43
-- Press any key to exit (Input "c" to continue) --
これの実行結果を見る限り、scanf("%*s")はどうも文字を無視するという訳でもなさそうですね。
バッファに残っている文字列を空にしていく、というわけでもなさそうですし。。。