【最大10000ポイント】当たる!!質問投稿キャンペーン!

C言語初心者です。よろしくお願いします。

whileなどのループ関数を使って、キーボード
入力をするたびに、ループが一度走る事は、
可能です。ですが、
常にループは走らせながらendなどの特定
の入力をされた場合に、ループを抜ける
プログラムをどうしてもできません。

わかる方、教えていただければ幸いです。

A 回答 (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 …
    • good
    • 1

マルチスレッドを使うような感じで作るプログラムですか?



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

こんな感じ?

この回答への補足

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

お願いします。

補足日時:2006/12/27 12:09
    • good
    • 0

こんなイメージですか?



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

#define COMMAND_STRING_SIZE6

typedef void (*func)(void);
typedef struct {
charcommandString[COMMAND_STRING_SIZE];
funccommandFunction;
} FUNCTIONMENU;

void func1(void){puts("hogeです。");}
void func2(void){puts("fugaです。");}

FUNCTIONMENUmenuTable[] = {
{"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;
}

動作確認図済みですが、質問者さんのレベルをまったく考慮せず、玄人好みに作ってしまいました。申し訳ありません。

この回答への補足

お早いお返事有難うございます。

このようにプログラムを書いてみた所、<conio.h>が
無いとなりました。これを調べたところ、windowsOSで
出来ないみたいです。こちらでは、LinuxOSを仕様して
います。

その点を踏まえていい案はありませんか?

補足日時:2006/12/27 12:11
    • good
    • 0

break;


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

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 While文(ループ)内の文字入力

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }

   return 0;
}

【実行結果(キーボードからは「 e 」と入力」)】
1文字を入力:e
入力したのは e です。
1文字を入力:入力したのは
です。
1文字を入力:

【私が意図している結果】
1文字を入力:e
入力したのは e です。
1文字を入力:


 ちなみにC言語の環境は、インターネットで無料で入手できる試食版です。(LSI C-86 Ver3.30c 試食版)
 上記プログラムを見てもらえればお分かりだと思いますが、「xを入力するまで、永遠と1文字入力とその表示を行う」ことを意図しています。しかし実際の結果は意図に反しています。
 1回目は正常に動作しているようですが、問題は2回目以降。scnafで入力待ちをすることなく、なぜかscanfをスルーする形で3回目のscanf入力待ちとなっています。この理由を教えてください。お願いします。

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == ...続きを読む

Aベストアンサー

>1文字を入力:入力したのは
>です。

は、[Enter]キーの入力によるためです。
[Enter]キーをスルーする必要があります。

   char a;
char dummy; /*[Enter]キー用*/

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);
scanf("%c",&dummy); /*[Enter]キー用*/

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }


で、どうでしょうか?

Q数値の連続入力終了条件について

C言語初心者です。よろしくお願いします。

早速質問なのですが、while文を使ったscanf()関数による数値連続入力で、
◎1----------------------------------------------
#include<stdio.h>
int main(void)
{
     double dt,sum=0.0;
     while(scanf("%lf",&dt) !=EOF){
  sum=sum+dt;
}
  printf("合計=%f\n",sum);
return 0;
}
----------------------------------------------
◎1のようにすれば、Ctrl+ZでEOFが返されたら終了とわかるのですが、今度は「0」が入力されたら処理を終了するというプログラムで、
◎2----------------------------------------------
#include<stdio.h>
int main(void)
{
     double dt,sum=0.0;
     while(scanf("%lf",&dt) !=0.0){
  sum=sum+dt;
}
  printf("合計=%f\n",sum);
return 0;
}
----------------------------------------------
◎2のようにすると「0」が入力されても、終了せず、以下に示す◎3のように、しないと終了出来ません。
◎3----------------------------------------------
#include<stdio.h>
int main(void)
{
     double dt,sum=0.0;
   
     scanf("%lf",&dt);
     while(dt!=0.0){
  sum=sum+dt;
scanf("%lf",&dt);
}
  printf("合計=%f\n",sum);
return 0;
}
----------------------------------------------
◎2で何故、◎1のように出来ず、◎3のようなscanf()を1回目、2回目と判定を入れなければならないか教えて下さい。

C言語初心者です。よろしくお願いします。

早速質問なのですが、while文を使ったscanf()関数による数値連続入力で、
◎1----------------------------------------------
#include<stdio.h>
int main(void)
{
     double dt,sum=0.0;
     while(scanf("%lf",&dt) !=EOF){
  sum=sum+dt;
}
  printf("合計=%f\n",sum);
return 0;
}
----------------------------------------------
◎1のようにすれば、Ctrl+ZでEOFが返されたら終了とわかるのですが、今度は「0」が入力されたら...続きを読む

Aベストアンサー

◎1の書き方では、無限ループする場合があります。

scanfは「正しく変換を行った回数、または、入力が尽きた場合にEOF」を返します。

例えば
1.2[Enter]
3.5[Enter]
kkk[Enter]
と入力すると、kkkを入力してEnterを押した瞬間、無限ループします。

scanfは「kkkは%lfに合わないので、0個を変換しました」と0を返し、入力バッファにkkkを残したままにします。

0はEOFとは違うので、そのままループを繰り返します。

入力バッファにはkkkが残ったまま消費されないので、次の回も、次の次の回も、scanfは永久に0を返し続けます。

そして、プログラムを止める事が出来なくなります。

◎2の書き方でも、やはり無限ループする場合があります。

今度は「kkk」とか「@@@」とか「abcdefgh」とか、実数に変換できない物を入力する事で止まります。

しかし「Ctrl+Z」などを打ち込み「入力が尽きた状態」にすると、scanfはEOFを返します。

0はEOFとは違うので、そのままループを繰り返します。

キーボード入力は「入力が尽きた状態」のままなので、次の回も、次の次の回も、scanfは永久にEOFを返し続けます。

そして、プログラムを止める事が出来なくなります。

◎3の書き方でも、やはり無限ループする場合があります。

今度は「0」を入力する事で止まります。

しかし「Ctrl+Z」などを打ち込み「入力が尽きた状態」にすると、scanfはEOFを返します。

この時、dtはscanfによって値を変更されませんから、dtは前回入力したままの「0以外の値」になっています。

dtが0以外では、ループを終了しません。そのままループを繰り返します。

キーボード入力は「入力が尽きた状態」のままなので、次の回も、次の次の回も、scanfは永久にEOFを返し続けます。

そして、プログラムを止める事が出来なくなります。

そう言った訳で、質問者さんの書いた3つのプログラムはどれも「無限ループする、大変に危険なプログラム」です。

下記のようなプログラムが「無限ループしない、安全なプログラム」です。
#include<stdio.h>
int main(void)
{
  double dt,sum=0.0;
  while(scanf("%lf",&dt) != 1){ // EOFや0を返したらやめる
    if (dt == 0.0) // 正しい入力でも、入力が「0」ならやめる
    sum=sum+dt;
  }
  printf("合計=%f\n",sum);
  return 0;
}
もちろん、scanfは1個しかありません。

◎1の書き方では、無限ループする場合があります。

scanfは「正しく変換を行った回数、または、入力が尽きた場合にEOF」を返します。

例えば
1.2[Enter]
3.5[Enter]
kkk[Enter]
と入力すると、kkkを入力してEnterを押した瞬間、無限ループします。

scanfは「kkkは%lfに合わないので、0個を変換しました」と0を返し、入力バッファにkkkを残したままにします。

0はEOFとは違うので、そのままループを繰り返します。

入力バッファにはkkkが残ったまま消費されないので、次の回も、次の次の...続きを読む

Q無限ループ内でのキー判別

DSPを用いたシステムを開発している途中なのですが。ループ内でのキー判別ができません。

whlie文で無限ループを行い,特定のキー(Enter等)が押されたらその動作を行うという判別ができません。
get関数等を無限ループの中で用いると,get文のところで止まってしまい,これでは私が求めている処理を行うことができません。

無限ループを行い,キー操作があった時だけその動作をする関数があれば教えてください。

PC:window7,visual stdio

Aベストアンサー

int c;

while( 1 ) {
if ( c = kbhit() ) {
switch( c ) {
case 0x0d:
         printf( "Enter Key\n" );
break;
    …
    …



の様に、kb_hit() が真の時に、getch() でキーコードを取得すればOKです。

キーコードを取得した後は、if 文か、switch文 (判別したいコードがたくさんある時は switch文がベター)で、それぞれのキーコードに従った処理を記述すれば良いです。

ご参考に。

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

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

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

どなたかよろしくお願いします。

Aベストアンサー

そのような、入力待ちにならないキー入力の方法は、処理系によって異なります。

MS-DOS系のconio.h、 unix系ならcursesライブラリでしょうか。
GUI用だとキー入力イベント等を使用することになるでしょう。

構造は極普通に、whileの継続条件を「キー入力が無かったら」とするか、無限ループ中で「キー入力があったらbreak;」とするかでしょう。

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qあるキーを押したら強制終了させるには。

Cの初心者です。
ある文字列をスクロールさせるプログラムを作りました。
ソースは以下です。
***********************************************
#include<stdio.h>
#include<string.h>

void wait(long x)
{
int i;
for(i=0;i<x;i++){/* do nothing */}
}

int main(void)
{
char name[]="Hello OK Wave";
int i;
int len=strlen(name);
int time=0;

while(1){

printf("\r");

for(i=0;i<=len;i++){

if(time+i<=len){
printf("%c",name[time+i]);
}
else
{
printf("%c",name[time+i-len-1]);
}
}

time++;
if(time>len){time=0;}

wait(1000000000);

}

return(0);

}
*********************************************
(ちなみにコンパイル時最後のリターン文が実行されないという警告が出ます)
一応これで目的の動作はしてくれるのですが、
これですとwhile(1)の中を延々と続けているのでプログラムを終了させるために
いちいちコマンドプロンプトごと終了させなければいけません。
(ちなみにコマンドプロンプト自体のコマンドはよくわからないです)

これですとなんだか嫌な感じなので、あるキー、たとえば'Q'を押したら
プログラムが終了してくれるようなことが出来ないだろうかと思っています。
exit(1)を使うのかな?と思いましたがどのようにキーを押したかの判定などを
すればよいのか悩んでいます。
どうかよろしくお願いいたします。

Cの初心者です。
ある文字列をスクロールさせるプログラムを作りました。
ソースは以下です。
***********************************************
#include<stdio.h>
#include<string.h>

void wait(long x)
{
int i;
for(i=0;i<x;i++){/* do nothing */}
}

int main(void)
{
char name[]="Hello OK Wave";
int i;
int len=strlen(name);
int time=0;

while(1){

printf("\r");

for(i=0;i<=len;i++){

if(time+i<=len){
...続きを読む

Aベストアンサー

初心者には難しい問題ですね。。OSに依存する機能なので。。。。
<基本的考え方>
1.2つの動作(終了入力を待つ事と別な処理)を、並列に実行する必要がある。
 ==>マルチプロセスやマルチスレッドの動作が
  必要。その使用方法はOSで異なる。
2.fork/beginthreadnなどの関数で並列動作を行う。
3.片方の処理は入力を待ち、もう一方で実際の処理を
行う。
4.終了の入力があったら、別プロセス・スレッドを終了して、全体を終了する。
<その他>
 プロセス、スレッドなどで検索してみて下さい。

参考URL:http://www.ncad.co.jp/~komata/c-kouza28.htm

Q数字以外が入力されたらエラー文を出したい。

scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、無限ループが発生してしまいます。
エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを作りたいのですが、どうすれば出来るでしょうか。

Aベストアンサー

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を strtod() 関数で整数に変換します。
・このときグローバル変数の errno を調べて ERANGE なら整数値のオーバーフローが起きたとか、
 第2引数で私のポインタに変換できなくなった位置をセットしますので、このポインタが \0 文字
 以外なら数字以外(アルファベットや記号)が混ざっていることになります。
・下にそのサンプルを載せます。

サンプル:
char buff[ 256 ];
char *argp;
int value;

// 文字列で入力
scanf( "%s", buff );
value = strtol( buff, &argp, 10 ); ←10進数で変換

// ここでチェック
if ( (errno != ERANGE) && (*argp != '\0') ){
 printf( "変換不可能な文字が入力されています。\n" );
 exit( 1 );
}

その他:
・上記のサンプルを使うには errno.h をインクルードして下さい。
 このヘッダに ERANGE 定数が定義されています。
 あと stdlib.h もインクルードしないと strtol() 関数が利用できません。
・以上。下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtol.html

★アドバイス
>scanfで数字を取り込みたいのですが、ここでaなどのアルファベットや記号を入力すると、
>無限ループが発生してしまいます。
 ↑
 ソースとかを見せて欲しいです。
 見ないとなぜ無限ループするのか判断できません。
>エラーが出ないように、数字以外が入力されたら、エラーメッセージを出すようなプログラムを
>作りたいのですが、どうすれば出来るでしょうか。
 ↑
 多分、scanf で整数の入力を行っていると思うので文字列で入力するようにします。
 そしてそのその文字列を str...続きを読む

Qchar型にint型の数値を代入する。

たとえば、
int num;
char box; 

numに何らかの整数値が入っているときに、そのnumの中に入っている値をchar型に文字列として代入したいときはどのようにすればいいのでしょうか?

Aベストアンサー

sprintf()っていう関数がありますよ。書式は

sprintf(char型の配列の先頭ポインタ,フォーマット,変数...)

二番目の引数以降はprintf()の引数と同じです。たとえば

int num;
char box[256];
num=100;
sprintf(box,"%d",num);
printf("%s",box);

→100と出力される


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング