• 締切済み

ループの特定入力終了

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