• ベストアンサー

ループのとめ方

入力した文字を小文字から大文字に 変えるプログラムで、コントロール+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;

質問者が選んだベストアンサー

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.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でも同様のことができるのではないでしょうか?

hgdream
質問者

お礼

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

その他の回答 (5)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.5

> 連続して2度コントロール+zを > 押さないととまらないのですが、 今,LSICをダウンロード; プログラムをWindows98でコンパイル・実行 してみましたが, Ctrl-Z 2回ではとまりませんでした. Ctrl-Z [ENTER] でとまりました. 質問は書き間違えで,実は上の動作をしている, ということでしょうか? (学校の?)課題が 「Ctrl-Z を入力したらプログラムが停止するようにせよ」 というのだったら, 「キーボードから,Ctrl-Z [ENTER]と続けておしたら停止する」 という今の動作で問題ないと思いますよ. MS-DOSでの入力の終了判定もそうですから.

hgdream
質問者

補足

wolvさんたびたびありがとうございます。 また、LSICをダウンロードしてプログラムをWindows98で、 実行していただきありがとうございます。 Ctrl-Z [ENTER]すると、何も表示されない 状態になり、さらに、Ctrl-Z [ENTER] を入力すると、プログラムが終了して 画面が消えるのです。 これを1回のCtrl-Z [ENTER]で、プログラム自体を 終了させたいのです。

  • fuji1
  • ベストアンサー率29% (109/371)
回答No.4

こんにちは。。 さて、このプログラムの問題点は、scanf にあると思います。 実際、1回の入力で終了させるためには、scanf (CR を待つ) のではなく、_getch などで、1文字ずつ入力をしてチェックする方法が一般的です。 _getch の戻り値を判定して、すぐに終了することができますが、画面インターフェースが変わってしまうので、サンプルは少し違います。 特に戻り値EOFがキーコードになってしまうことです。 =============================== #include <stdio.h> #include <ctype.h> #include <conio.h> #define EOF 0x1a int main(void) { char check=0; while(true){ check = _getche(); if(check!=EOF){ printf("%c",toupper(check)); } else { break; } } return 0; } =============================== 表示も違いますが、あとは作れますよね。 Cの勉強頑張ってください。

hgdream
質問者

補足

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

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.3

Ctrl-Zにこだわりますか? そうでないなら,文字列の長さが0だったらとまる などとすれば実現できそうです. 間違ってとめてしまうのを避けるならば, プログラム停止前に確認メッセージを出し, リターン以外の文字(y)などで本当停止 するようにすればいいと思います.

hgdream
質問者

補足

wolvさん、下で、名前を書き間違えてしまいました。 すみません。 >Ctrl-Zにこだわりますか? 課題がCtrl-Zで、とまるようにとあるのです。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

ごめんなさい,コントロール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で宣言したら, 一発でとまるようになりました.

hgdream
質問者

補足

molvさん回答ありがとうございます。 >Ctrl-Zを押すと,mojiには何が入るんですか? このあたりが、うまくscanfで機能していない ようです。checkに-1が入ることを期待しているのですが、 入っていないようです。 check を intで宣言ましたが、結果はうまくいきませんでした。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

sgi IRIX native C でコンパイルしたら, 一発でとまるバイナリ-ができましたよ. 使っているコンピューター・C・端末の種類などによって影響がでるのでは ないでしょうか. 蛇足: 1.末尾の}がぬけてますね. 2.Enterの前に\nを入れたほうがいいように思います.

hgdream
質問者

補足

wolvさん回答ありがとうございます。 なるほどOSなどの環境により違いが 生じるのですね。 自分の使用環境はOSWindows2000、 Visual C++6.0 Professionalです。 なにかよい解決方法はないのでしょうか? 蛇足は1は、貼り付けたら抜けたようです。 2はそうしたいと思います。 ありがとうございました。

関連するQ&A