リターンで終了するには??

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
natu

リターンで終了するには??

#1

投稿記事 by natu » 15年前

リターンキーでするにはどんな方法がありますか??
押すまでループから抜け出せないように作りたいのですが・・・。

fatens

Re:リターンで終了するには??

#2

投稿記事 by fatens » 15年前

DXライブラリでしょうか?
そうならばこれでいけると思います。

int WINAPI WinMain(...)
{
ChangeWindowMode(TRUE);
DxLib_Init();

while (!ProcessMessage() && !CheckHitKey(KEY_INPUT_RETURN)) {
//いろいろな処理
}

DxLib_End();

return 0;
}

natu

Re:リターンで終了するには??

#3

投稿記事 by natu » 15年前

すみません。DXライブラリではないです。

fatens

Re:リターンで終了するには??

#4

投稿記事 by fatens » 15年前

では何なのか書いていただかないと分からないのですが...

natu

Re:リターンで終了するには??

#5

投稿記事 by natu » 15年前

do{
end = getchar();
}while(end != '\n');

でやってるんですけど、リターン押す前に終わってしまうんです。

fatens

Re:リターンで終了するには??

#6

投稿記事 by fatens » 15年前

おそらくストリームに残った改行文字を読み込んでしまっているのだと思います。
ループの中でscanf 関数などを呼び出している部分があれば、その部分も書いてみてください。

natu

Re:リターンで終了するには??

#7

投稿記事 by natu » 15年前

短いので、全部書いてみました。お願いします。

int main(void){
  char str[10];
  char end;
  int i, enter;

  printf("文字列を入力");
  scanf("%s", str);
  do{
    printf("1:表示\n");
    printf("2:終わり\n");
    printf("入力 ⇒ ");
    scanf("%d", &enter);
    printf("\n");
    if(enter > 2 || enter == 0){
      printf("もう一度入力してください\n");
      printf("\n");
}
if(enter == 1){
      for(i = 0; i < 10; i++){
        printf("%c", str);
  }
  do{
    printf("\n");
    printf("リターンを押してください\n");
    end = getchar();
  }while(end != '\n');
     }
  }
while(enter != 2 );
}

バグ

Re:リターンで終了するには??

#8

投稿記事 by バグ » 15年前

if (enter == 1){


の前に…


getchar();


を追加してみてください

natu

Re:リターンで終了するには??

#9

投稿記事 by natu » 15年前

「リターンを押してください」の後、入力を待つようになりました。
何でですか??

バグ

Re:リターンで終了するには??

#10

投稿記事 by バグ » 15年前

scanf関数で数値を入力する際の動作を思い出してみてください。

1:任意の数字を押す
2:エンターを押す

という順番で操作しますよね?

実は、2で実行された「エンターキーが押された」という情報はscanf関数では処理されずに残っています。なので、natuさんの書かれたプログラムでは入力待ち状態になった瞬間に残っていた「エンターキーが押された」という情報を読み取って終了してしまっていた訳です。

という訳で、その情報をgetchar関数を使って空読みして処理して解決したという訳です。

natu

Re:リターンで終了するには??

#11

投稿記事 by natu » 15年前

へ~。じゃぁ、scanfで入力しない方がいいんですか??

バグ

Re:リターンで終了するには??

#12

投稿記事 by バグ » 15年前

そういう訳ではありません。使い方を間違えなければ全く問題ないです。
たしかに、scanf系の関数を嫌って使わない人もいますけどね…。
まぁ、その辺は好みの問題かと思います。

natu

Re:リターンで終了するには??

#13

投稿記事 by natu » 15年前

わかりました。ありがとうございます。

natu

Re:リターンで終了するには??

#14

投稿記事 by natu » 15年前

あっ。でも、リターン以外を入れてからリターンってすると
ループを抜けちゃいました・・・。

バグ

Re:リターンで終了するには??

#15

投稿記事 by バグ » 15年前

while(end != '\n');

この部分がマズイですね。エンターキーのアスキーコードはおそらく0x0dだったはずなので…

while(end != 0x0d);

に変更してみてください。

naohiro19

Re:リターンで終了するには??

#16

投稿記事 by naohiro19 » 15年前

Windowsプログラミングならウィンドウプロシージャに記述すればいいです
case WM_KEYDOWN:
     switch(wParam){
         case VK_RETURN:
               DestroyWindow(hWnd);
               break;
     }
     break;

バグ

Re:リターンで終了するには??

#17

投稿記事 by バグ » 15年前

申し訳ないです。うちの環境で試してみたのですが、エンターキーのアスキーコードは0x0dではなく、0x0aでした。

natu

Re:リターンで終了するには??

#18

投稿記事 by natu » 15年前

ありがとうございました。解決できました。

ISLe

Re:リターンで終了するには??

#19

投稿記事 by ISLe » 15年前

stdinでfgetsしてsscanfで面倒なことが一気に解消するのだけど中間にバッファが必要だから(初心者向けには)避けられているのでしょうかね。

閉鎖

“C言語何でも質問掲示板” へ戻る