• 締切済み

ループの特定入力終了

C言語初心者です。よろしくお願いします。 whileなどのループ関数を使って、キーボード 入力をするたびに、ループが一度走る事は、 可能です。ですが、 常にループは走らせながらendなどの特定 の入力をされた場合に、ループを抜ける プログラムをどうしてもできません。 わかる方、教えていただければ幸いです。

みんなの回答

  • Musaffah
  • ベストアンサー率36% (37/101)
回答No.4

コンパイルもコードチェックも何もしてないので、動くかどうかわかりませんが、雰囲気はこんな感じです。 main()関数で無限ループし、スレッド(thd_func())で無限ループを抜けるか(main()を終了させるか)チェックするという単純なものです。 UNIX(LINUX)系のCでスレッド生成方法知らないので、Windows系で書きました。Windows系のスレッド生成方法は参考URLを見てください。 これで分かります?? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <proccess.h> #ifdef TRUE #define TRUE 1 #endif #ifdef FALSE #define FALSE 0 #endif void thd_func(void); void main(){ int isLoop; isLoop = TRUE; _beginthread(thd_func, 0, (void *)&isLoop); while (g_isLoop == TRUE) { <<何か処理をいれる>> } } void thd_func(void *p_isLoop) { char inp[256]; do { scanf("%s", inp); } while(strcmp(inp, "END") != 0); *p_isLoop = FALSE; _endthread(); }

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt__beginthread.2c_._beginthreadex.asp
  • Musaffah
  • ベストアンサー率36% (37/101)
回答No.3

マルチスレッドを使うような感じで作るプログラムですか? 1)スレッドを2つ(A,B)実行。 2)スレッドAでは、ひたすら何かをする(無限ループにならない程度)。 3)スレッドBでは、ループ関数を使って"END"が入力されるまで待つ。 4)スレッドBで"END"入力確認にて、スレッドAに終了指令を出す。 5)スレッドAのループ脱出条件は、スレッドBからの終了指令。 こんな感じ?

zoronet
質問者

補足

はい。そのような感じです。 出来ればですが、スレッドAでは無限ループ で行いたいのです。 お願いします。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

こんなイメージですか? #include <stdio.h> #include <conio.h> #include <string.h> #define COMMAND_STRING_SIZE 6 typedef void (*func)(void); typedef struct { char commandString[COMMAND_STRING_SIZE]; func commandFunction; } FUNCTIONMENU; void func1(void){ puts("hogeです。"); } void func2(void){ puts("fugaです。"); } FUNCTIONMENU menuTable[] = { {"hoge", func1}, {"fuga", func2}, {"quit", NULL}, {NULL, NULL} }; void main(void) { char buffer[100]; int i=0; buffer[0] = '\0'; while(1){ /* キー入力をバッファに保存する。*/ while(kbhit()){ gets(buffer); break; } /* 保存したバッファの中身で、実行すべき処理を選ぶ。*/ if( strlen(buffer) ){ for(i=0; NULL!=menuTable[i].commandString[0]; i++){ if(0 == strcmp(buffer, menuTable[i].commandString) ){ if( 0 == strcmp("quit",buffer) ) goto END; else{ menuTable[i].commandFunction(); buffer[0] = '\0'; break; } } } } /* -- キー入力に関係なく、常に実行したい処理はこちらに書く。-- */ /* ------------------------------------------------------------ */ } /* end of while(1) */ END: return; } 動作確認図済みですが、質問者さんのレベルをまったく考慮せず、玄人好みに作ってしまいました。申し訳ありません。

zoronet
質問者

補足

お早いお返事有難うございます。 このようにプログラムを書いてみた所、<conio.h>が 無いとなりました。これを調べたところ、windowsOSで 出来ないみたいです。こちらでは、LinuxOSを仕様して います。 その点を踏まえていい案はありませんか?

  • hogepuke
  • ベストアンサー率33% (1/3)
回答No.1

break; で、ループを抜けれるので、 while() { 処理(); 処理(); if() { /* 特定の条件に当てはまったときにこのループを抜ける */ break; } } みたいな感じで作られたらいかがなものでしょうか。

関連するQ&A

  • キーボード入力によるループの終了

    C言語で、キーボードから何も入力が無い場合は、同じ処理を一定の時間で続けていき、キーボードから入力(例えばスペースを入力)があった場合のみ、ループを抜ける(処理を終了する)というプログラムを組みたいと思っているのですが、どのようなソース文にすればよいでしょうか。 どなたかよろしくお願いします。

  • キーボード入力の終了につきまして(ループ処理内)

    いつも参考にさせて頂いております佐藤と申します。 JAVA言語を勉強し初めて数ヶ月程度ですが、楽しさが分かって参りました。 質問させて頂きたい内容は、ループ処理(キーボードや入力ファイルがNULLになるまで繰り返す)でのキーボード入力をどうすれば終了させられるかです。 //読込チェック=NULLならば処理を終了させる while((check = buf.readLine())!=null){ char[] src = check.toCharArray(); ソースの一部ですが、これでは入力ファイルがNULLになれば終了出来ますが、キーボードからの入力だとNULL(何も入力せずにエンター)でも終了しません。 原因が分かる方はいらっしゃいますでしょうか? 宜しくお願い致します。

  • 永久ループ・・・

    どうも、最近C言語の勉強を始めた超初心者です。 int main(void) { int i; for(;;){ printf("桁数を入力してください。:"); scanf("%d",&i); if(i<=12) break; else puts("もう一度入力してください。"); continue; } return(0); } 上のソース、i<=12の条件を満たさなければループを繰り返すというプログラムなんですけど、数値を入力した場合は思った通りに挙動するのですが、文字や文字列を入力すると永久ループになります。scanf関数で返値を受け取って判定するなどいろいろ試したのですが、どうしても永久ループになってしまいます。 どうしてか教えてください。お願いします。

  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

  • ある特定も文字'#'が入力されるまで実行

    C言語である特定の文字#が入力されるまで 入力し、#が入力されたら、合計を出力するプログラム はどのようだと思われますか? #はgetchar()でとるのが最善でしょうか?

  • ループ中でのscanfおよびcin

    あまりに基礎的な質問ですが,ループ中の入力関数が期待する動作になりません. コードを載せます while (1) { int key; scanf("%d", &key); if (key == 1) break; } 期待する動作は1が入力されるまでループし続けるというものですが scanfは一度しか実行されずループし続けます,cinに変えても同様でした 何が原因か分かる方,ご教示ください

  • ループ最中で例外の時の抜け方

    whileループ処理をさせてもし例外 が発生したらループから出る命令を 教えてください。 C言語はたしかbreakでしたよね。

    • ベストアンサー
    • Perl
  • ループを途中で抜けたいのですが。

    無限ループさせているwhileやfor文などで、 何かのキーを押すとループを抜けるように設定したいのですが可能でしょうか? (scanfやcinなどをループの中に組み込まずに。ctrl+Cも無しで。) (あと、フォーム上ではなくコンソール上で。) 多分説明不足なのでもうちょっと詳しく。 たとえば、 while ( i != 1 ){ j += 1; } の様な無限ループを設定したとして、 本来なら if (j > 100 ){ break; } とか、 while文の中に scanf ( "%d" , &i ); 等を入れて終了条件を満たさせるべきですが、 そうではなく、ひたすら無限ループを続けているところにEscキーを押すとループから脱出するようなプログラムを作ってみたいのです。 そういうプログラムは可能でしょうか? どうかご教授下さい。 使用コンパイラ:Visual C++ 2008 Express Edition

  • 処理KEY入力で終了させる方法

    今、学習でC言語を使いCPUのアドレスのデータを表示させるプログラムを組んでいます。 表示させるのは出来たのですが、表示させるたびに、プログラムが終わってしまうので、何回も入力するのがわずらわしい状態です。 例えば、連続でデータが半永久的に表示され、何かKEYを押すだけでそのデータ表示を強制終了 させることは可能でしょうか? ソースは、簡単なのですが、 #include<stdio.h> #define Dout 0x03ff int main { int i; DATA=inp(Dout); printf("DATA:%d\n",DATA); return(0); } while(1)で、無限ループをし、CTRL+Cなどで、抜ける方法はあると思うのですが、それ以外の方法で、プログラムを組むことは可能でしょうか?

  • ループ途中に強制終了

    int main() { while(1){ 繰り返し処理} return 0; } この場合、ブレークを記入しない限り止まらないですね。 止まらない中でEnterキーを押せばループから抜け出して強制終了させるようなコマンドはありますか? 初心者なので丁寧に教えていただければ幸いです。

専門家に質問してみよう