C言語関係掲示板

過去ログ

No.72. BCBやVC++での「CTRL+Z」入力


今晩は。内容的に新規にした方がいいと思うので、新規にします。
一応、No.69の続きです。

>>あと、VC++やBCBで、scanfやgetsの標準入力では「CTRL+Z」の入力で動作が
>>おかしくなる、というのもありました。これは、Windowsの環境で「CTRL+Z」
>>は「Undo」のショートカットキーだからだと思うのですが。

>これはCの問題というよりはOSとかシェルの問題ですねー。どうやってEOFを
>入力するか(アゲアシトリ)。

VC++やBCBで、「CTRL+Z」の入力自体はできるんですがどうもその後の
出力結果を取り消してしまうようなんです。

#include <stdio.h>
int main(void) 
{
        int i=1, tmp;

        while(scanf("%d",&tmp) != EOF) {
                printf("i=%d\n",i++);
        }
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        return(0);
}


このプログラムで、1,2,CTRL+Zを順に入力すると、BCBでの出力画面は
1  ・・・ これは入力
i=1
2  ・・・ これは入力
i=2 ・・・ この後「CTRL+Z」を入力
i=[4]
i=[5]

です。入力はDOSで行っています。

いったんは出力するけれど、「Undo」が働いて取り消されてしまう
と思っているんですけどね。
回避策があれば知りたいと思っています。何かご存知ですか。


ども。

めんどくさいので全文引用。スミマセン。

>今晩は。内容的に新規にした方がいいと思うので、新規にします。
>一応、No.336の続きです。
>
>>>あと、VC++やBCBで、scanfやgetsの標準入力では「CTRL+Z」の入力で動作が
>>>おかしくなる、というのもありました。これは、Windowsの環境で「CTRL+Z」
>>>は「Undo」のショートカットキーだからだと思うのですが。
>
>>これはCの問題というよりはOSとかシェルの問題ですねー。どうやってEOFを
>>入力するか(アゲアシトリ)。
>
>VC++やBCBで、「CTRL+Z」の入力自体はできるんですがどうもその後の
>出力結果を取り消してしまうようなんです。
>
>#include <stdio.h>
>
int main(void) 
{
        int i=1, tmp;

        while(scanf("%d",&tmp) != EOF) {
                printf("i=%d\n",i++);
        }
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        return(0);
}

>
>このプログラムで、1,2,CTRL+Zを順に入力すると、BCBでの出力画面は
>1  ・・・ これは入力
>i=1
>2  ・・・ これは入力
>i=2 ・・・ この後「CTRL+Z」を入力
>i=[4]
>i=[5]
>
>です。入力はDOSで行っています。
>
>いったんは出力するけれど、「Undo」が働いて取り消されてしまう
>と思っているんですけどね。
>回避策があれば知りたいと思っています。何かご存知ですか。

おとといから、VCが使えるマシンを割り当てられたので
ためしにやってみました。
ら、とくに問題なく動きました(DOSプロンプトと同じ結果)。
BCBのほうは終了するとすぐDOS窓を閉じてしまいますが
(設定できるのかな?)ブレイクポイントを適当に設定して
トレース実行すれば確認できます(しました)。
# 最後にgetchar()とか書いとくのもありかと

あ、BCB4とVC6です。

では。


返信ありがとうございます。

># 最後にgetchar()とか書いとくのもありかと

なるほど、そういう手もありますね。
int main(void) 
{
        int i=1, tmp;

        while(scanf("%d",&tmp) != EOF) {
                printf("i=%d\n",i++);
        }
        tmp = getchar();
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        printf("i=[%d]\n",i++);
        return(0);
}

で、回避できました。


ども。

たいしたことじゃないですが。。

もし、Warningを抑えるためにtmpを用意したのであれば、

(void)getchar();

というようにキャストして、返り値をすてることを
明示的に書けば、(tmpなしで)OKです。

何も書かなくても(他の、printf()とかと同様に)
たぶん警告されません。


われながらこまかいことを気にしすぎ。すみません。。

では。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.11.15
Copyright(c) 2000-2002 TOMOJI All Rights Reserved