ページ 11

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

Posted: 2010年7月12日(月) 09:34
by natu
リターンキーでするにはどんな方法がありますか??
押すまでループから抜け出せないように作りたいのですが・・・。

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

Posted: 2010年7月12日(月) 10:11
by fatens
DXライブラリでしょうか?
そうならばこれでいけると思います。

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

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

DxLib_End();

return 0;
}

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

Posted: 2010年7月12日(月) 10:35
by natu
すみません。DXライブラリではないです。

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

Posted: 2010年7月12日(月) 10:43
by fatens
では何なのか書いていただかないと分からないのですが...

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

Posted: 2010年7月12日(月) 11:10
by natu
do{
end = getchar();
}while(end != '\n');

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

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

Posted: 2010年7月12日(月) 11:16
by fatens
おそらくストリームに残った改行文字を読み込んでしまっているのだと思います。
ループの中でscanf 関数などを呼び出している部分があれば、その部分も書いてみてください。

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

Posted: 2010年7月12日(月) 11:44
by natu
短いので、全部書いてみました。お願いします。

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:リターンで終了するには??

Posted: 2010年7月12日(月) 16:11
by バグ
if (enter == 1){


の前に…


getchar();


を追加してみてください

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

Posted: 2010年7月12日(月) 16:25
by natu
「リターンを押してください」の後、入力を待つようになりました。
何でですか??

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

Posted: 2010年7月12日(月) 16:45
by バグ
scanf関数で数値を入力する際の動作を思い出してみてください。

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

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

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

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

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

Posted: 2010年7月12日(月) 16:48
by natu
へ~。じゃぁ、scanfで入力しない方がいいんですか??

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

Posted: 2010年7月12日(月) 16:58
by バグ
そういう訳ではありません。使い方を間違えなければ全く問題ないです。
たしかに、scanf系の関数を嫌って使わない人もいますけどね…。
まぁ、その辺は好みの問題かと思います。

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

Posted: 2010年7月12日(月) 16:59
by natu
わかりました。ありがとうございます。

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

Posted: 2010年7月12日(月) 17:36
by natu
あっ。でも、リターン以外を入れてからリターンってすると
ループを抜けちゃいました・・・。

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

Posted: 2010年7月12日(月) 18:28
by バグ
while(end != '\n');

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

while(end != 0x0d);

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

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

Posted: 2010年7月13日(火) 08:35
by naohiro19
Windowsプログラミングならウィンドウプロシージャに記述すればいいです
case WM_KEYDOWN:
     switch(wParam){
         case VK_RETURN:
               DestroyWindow(hWnd);
               break;
     }
     break;

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

Posted: 2010年7月13日(火) 09:51
by バグ
申し訳ないです。うちの環境で試してみたのですが、エンターキーのアスキーコードは0x0dではなく、0x0aでした。

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

Posted: 2010年7月13日(火) 12:07
by natu
ありがとうございました。解決できました。

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

Posted: 2010年7月13日(火) 17:06
by ISLe
stdinでfgetsしてsscanfで面倒なことが一気に解消するのだけど中間にバッファが必要だから(初心者向けには)避けられているのでしょうかね。