dポイントプレゼントキャンペーン実施中!

入力した文字を小文字から大文字に
変えるプログラムで、コントロール+z
で、ループを抜け出すようにしたい。
連続して2度コントロール+zを
押さないととまらないのですが、
どのようにすれば、1度コントロール+zを
押すだけで、終了できるのでしょうか?
何かアドバイスをお願いします。

========================================

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void)
{
char moji[50],check=0;
int i,len;

while(check !=EOF){
 printf("Enter : ");
 check = scanf("%s",moji);
 len=strlen(moji);
 if(check!=EOF){
  printf("Display : ");
  for(i=0;i<len;i++){
    printf("%c",toupper(moji[i]));
  }
}
}

return 0;

A 回答 (6件)

私のパソコンは Windows 98 なので,


hgdreamさんの例とは違うかもしれませんが,

Explorerのウィンドウの中にある
コンパイル・リンクの結果できた実行ファイルのアイコン
をダブルクリックして起動した場合,
MS-DOSのウィンドウが開き,
その中で作成したプログラムが動きます.

1度めの Ctrl-zでプログラムは止まっています.
私の場合は,画面の表示はそのままですが,
MS-DOSコマンド等はうけつけません.

さらに何かキーを入力すると,
ウィンドウを閉じてもいいかどうか確認するメッセージがでます.

-------------------------------------------------------------

そこで,
hgdreamさんの場合も,
- プログラムは既に希望どおりのものができている.
- 2度めの Ctrl-zでウィンドウが閉じるのは,Windowsの機能の一部.
ではないかと思います.

-------------------------------------------------------------

参考:

Windows 98 の場合は,
実行ファイルのアイコンの設定で,
自動的にウィンドウが閉じるようにできます.
つまり,Ctrl-Z(+ENTER)一回で,
プログラムが終了し,ウィンドウが閉じます.

設定方法:
Explorerのウィンドウの中にある実行ファイルのアイコンを右クリックし,
出たメニューから,「プロパティ(R)」を選び,
開いたダイアログの「プログラム」タブ内の
「プログラム終了時にウィンドウを閉じる(X)」チェックボックスに
チェックを入れておくと,
プログラム終了時に自動的にウィンドウが閉じます.

Windows 2000でも同様のことができるのではないでしょうか?
    • good
    • 0
この回答へのお礼

wolvさんどうもありがとうございます。
Windows 98では、うまく動くようですね。
Windowsの機能についてまで、詳しく
かつ、わかりやすく教えていただき
参考になりました。
ありがとうございます。
今回はこれで、よいと
区切りをつけます。
何度も教えていただきありがとうございました。

お礼日時:2002/05/05 22:32

> 連続して2度コントロール+zを


> 押さないととまらないのですが、

今,LSICをダウンロード; プログラムをWindows98でコンパイル・実行
してみましたが,
Ctrl-Z 2回ではとまりませんでした.
Ctrl-Z [ENTER]
でとまりました.
質問は書き間違えで,実は上の動作をしている,
ということでしょうか?

(学校の?)課題が
「Ctrl-Z を入力したらプログラムが停止するようにせよ」
というのだったら,
「キーボードから,Ctrl-Z [ENTER]と続けておしたら停止する」
という今の動作で問題ないと思いますよ.

MS-DOSでの入力の終了判定もそうですから.

この回答への補足

wolvさんたびたびありがとうございます。
また、LSICをダウンロードしてプログラムをWindows98で、
実行していただきありがとうございます。

Ctrl-Z [ENTER]すると、何も表示されない
状態になり、さらに、Ctrl-Z [ENTER]
を入力すると、プログラムが終了して
画面が消えるのです。

これを1回のCtrl-Z [ENTER]で、プログラム自体を
終了させたいのです。

補足日時:2002/05/05 20:18
    • good
    • 0

こんにちは。


さて、このプログラムの問題点は、scanf にあると思います。
実際、1回の入力で終了させるためには、scanf (CR を待つ) のではなく、_getch などで、1文字ずつ入力をしてチェックする方法が一般的です。
_getch の戻り値を判定して、すぐに終了することができますが、画面インターフェースが変わってしまうので、サンプルは少し違います。
特に戻り値EOFがキーコードになってしまうことです。

===============================
#include <stdio.h>
#include <ctype.h>
#include <conio.h>

#defineEOF0x1a

int main(void)
{
char check=0;

while(true){
check = _getche();
if(check!=EOF){
printf("%c",toupper(check));
} else {
break;
}
}

return 0;
}
===============================

表示も違いますが、あとは作れますよね。
Cの勉強頑張ってください。

この回答への補足

fuji1さん回答ありがとうございます。
参考になしましたが、
1文字ずつ入力で、文字列を扱うのがなかなか難しい。

補足日時:2002/05/04 23:20
    • good
    • 0

Ctrl-Zにこだわりますか?


そうでないなら,文字列の長さが0だったらとまる
などとすれば実現できそうです.

間違ってとめてしまうのを避けるならば,
プログラム停止前に確認メッセージを出し,
リターン以外の文字(y)などで本当停止
するようにすればいいと思います.

この回答への補足

wolvさん、下で、名前を書き間違えてしまいました。
すみません。

>Ctrl-Zにこだわりますか?
課題がCtrl-Zで、とまるようにとあるのです。

補足日時:2002/05/04 23:17
    • good
    • 0

ごめんなさい,コントロールZで


実行が中断されたのは,UNIXの(cshの?)仕様でした.

check = scanf("%s",moji);

でCtrl-Zを押すと,mojiには何が入るんですか?
checkには何が入るんですか? 確認しましたか?

printf("EOF:%d\n",EOF);

printf("check: %d\n", check);
というコードを埋め込んで実行したところ,
EOFは-1でしたが,
終了文字(UNIXではCtrl-D)を押したときのcheckの値は255でしたよ.

char 型に-1を代入しても-1として認識されないということではないですか?

check を intで宣言したら,
一発でとまるようになりました.

この回答への補足

molvさん回答ありがとうございます。

>Ctrl-Zを押すと,mojiには何が入るんですか?
このあたりが、うまくscanfで機能していない
ようです。checkに-1が入ることを期待しているのですが、
入っていないようです。

check を intで宣言ましたが、結果はうまくいきませんでした。

補足日時:2002/05/04 14:22
    • good
    • 0

sgi IRIX native C でコンパイルしたら,


一発でとまるバイナリ-ができましたよ.

使っているコンピューター・C・端末の種類などによって影響がでるのでは
ないでしょうか.

蛇足:
1.末尾の}がぬけてますね.
2.Enterの前に\nを入れたほうがいいように思います.

この回答への補足

wolvさん回答ありがとうございます。
なるほどOSなどの環境により違いが
生じるのですね。

自分の使用環境はOSWindows2000、
Visual C++6.0 Professionalです。

なにかよい解決方法はないのでしょうか?

蛇足は1は、貼り付けたら抜けたようです。
2はそうしたいと思います。
ありがとうございました。

補足日時:2002/05/04 13:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!