C言語関係掲示板

過去ログ

No764 VC++でctrl+zの入力

[戻る] [ホームページ]
No.38

演習問題の15-4-1の解答例についての質問
投稿者---ジジ(2003/06/02 13:06:29)


ここの問題の演習15-4-1の問題で、ctrl+zを押すまで入力しつづけるという問題がありました。
その問題をやっていて疑問に思ったのがctrl+zを2回押さないと入力を終わることができません。
なぜこうなってしまうのでしょうか?
また、どうすれば直るのでしょうか?

No.40

Re:演習問題の15-4-1の解答例についての質問
投稿者---こん!(2003/06/02 13:24:48)


>ここの問題の演習15-4-1の問題で、ctrl+zを押すまで入力しつづけるという問題がありました。
>その問題をやっていて疑問に思ったのがctrl+zを2回押さないと入力を終わることができません。

こちらではなりませんでした。(ここからコピペで無修正)
皆さんに確認を取って頂きやすいようにあなたの作業環境を示されたらいかがでしょうか?
またソースに修正を入れているのであればその箇所の掲示も・・・

ちなみに私のところは
Windows2000+sp3 BCC Developer Ver.1.2.3 Borland C++5.5.1
です。

No.41

Re:演習問題の15-4-1の解答例についての質問
投稿者---Create(2003/06/02 14:39:41)


>>ここの問題の演習15-4-1の問題で、ctrl+zを押すまで入力しつづけるという問題がありました。
>>その問題をやっていて疑問に思ったのがctrl+zを2回押さないと入力を終わることができません。
>
ctrt+Z+Enterを2回で終了しました。
ここからコピペで無修正)

ちなみに私のところは
Windows2000+sp2 VC++6.0(Sp5)
です。


No.42

Re:演習問題の15-4-1の解答例についての質問
投稿者---ジジ(2003/06/02 14:45:06)


すいません。
Windows2000+sp3 Microsoft Visual C++(R)6.0です。


No.44

Re:演習問題の15-4-1の解答例についての質問
投稿者---こん!(2003/06/02 16:19:22)


>Windows2000+sp3 Microsoft Visual C++(R)6.0です。

ほんまですね。VC++だとそのままscanfのソースまでデバッグで入っていけるの
で途中まで追ってみましたが(くじけた・・・)最初が_input()の中の
EAT_WHITE();でキー入力をしここでCtrl+Zを入力すると各種フォーマットチェ
ックをした後でINC();なるところでまたキー入力待ちになるようです。

なんででしょね?ナレッジベースのどっかにドキュメントがあるかな?

_input()のソースたいした量じゃないから時間があれば追えそうね。
今やってる時間がない。きっと知ってる人が出てくるでしょう・・・
(他力本願)

No.45

Re:演習問題の15-4-1の解答例についての質問
投稿者---こん!(2003/06/02 17:35:38)


>・・・_input()の中のEAT_WHITE();でキー入力をしここでCtrl+Zを入力すると

ここで通常は文字列をストリームバッファに入力し

>ックをした後でINC();なるところでまたキー入力待ちになるようです。

ここでストリームバッファから1文字ずつ取り出して書式文字列に従い変換して
いる様だがCtrl+Zを入力した場合EAT_WHITE();から直接戻り値としてEOFが返っ
てきている。そしてストリームバッファにはデータが無い為INC();に来た時点で
再度ストリーム(今回はキーボードから)から入力しようとする。
ので2回止まってしまう。

これって回避出来るの?分からん・・・


No.54

Re:演習問題の15-4-1の解答例についての質問
投稿者---ともじ(2003/06/02 23:55:02)


>これって回避出来るの?分からん・・・

Ctrl+Zは根が深いですね。
Windows9xとMe上のWindows系のCだと、Ctrl+Z の入力後、次の改行
までの表示が行なわれませんし。

回避方法と呼べるかどうかはわかりませんが、%s以外の入力では
Ctrl+Z も一回で受け付けるようですので、次のように先に体重と身長を
入力してください。
    printf( "体重、身長、氏名を入力しなさい。(終了条件:Ctrl+Z)\n" );
    while( ( scanf( "%lf %lf %s", &sintai[i].taijyu, &sintai[i].sincyou, 
             sintai[i].name ) != EOF ) && i<NINZUU ) {

        i++;
    }