- ベストアンサー
ループのとめ方
入力した文字を小文字から大文字に 変えるプログラムで、コントロール+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;
- みんなの回答 (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でも同様のことができるのではないでしょうか?
その他の回答 (5)
- wolv
- ベストアンサー率37% (376/1001)
> 連続して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]で、プログラム自体を 終了させたいのです。
- fuji1
- ベストアンサー率29% (109/371)
こんにちは。。 さて、このプログラムの問題点は、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の勉強頑張ってください。
補足
fuji1さん回答ありがとうございます。 参考になしましたが、 1文字ずつ入力で、文字列を扱うのがなかなか難しい。
- wolv
- ベストアンサー率37% (376/1001)
Ctrl-Zにこだわりますか? そうでないなら,文字列の長さが0だったらとまる などとすれば実現できそうです. 間違ってとめてしまうのを避けるならば, プログラム停止前に確認メッセージを出し, リターン以外の文字(y)などで本当停止 するようにすればいいと思います.
補足
wolvさん、下で、名前を書き間違えてしまいました。 すみません。 >Ctrl-Zにこだわりますか? 課題がCtrl-Zで、とまるようにとあるのです。
- wolv
- ベストアンサー率37% (376/1001)
ごめんなさい,コントロール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で宣言ましたが、結果はうまくいきませんでした。
- wolv
- ベストアンサー率37% (376/1001)
sgi IRIX native C でコンパイルしたら, 一発でとまるバイナリ-ができましたよ. 使っているコンピューター・C・端末の種類などによって影響がでるのでは ないでしょうか. 蛇足: 1.末尾の}がぬけてますね. 2.Enterの前に\nを入れたほうがいいように思います.
補足
wolvさん回答ありがとうございます。 なるほどOSなどの環境により違いが 生じるのですね。 自分の使用環境はOSWindows2000、 Visual C++6.0 Professionalです。 なにかよい解決方法はないのでしょうか? 蛇足は1は、貼り付けたら抜けたようです。 2はそうしたいと思います。 ありがとうございました。
お礼
wolvさんどうもありがとうございます。 Windows 98では、うまく動くようですね。 Windowsの機能についてまで、詳しく かつ、わかりやすく教えていただき 参考になりました。 ありがとうございます。 今回はこれで、よいと 区切りをつけます。 何度も教えていただきありがとうございました。