リターンで終了するには??
Re:リターンで終了するには??
DXライブラリでしょうか?
そうならばこれでいけると思います。
int WINAPI WinMain(...)
{
ChangeWindowMode(TRUE);
DxLib_Init();
while (!ProcessMessage() && !CheckHitKey(KEY_INPUT_RETURN)) {
//いろいろな処理
}
DxLib_End();
return 0;
}
そうならばこれでいけると思います。
int WINAPI WinMain(...)
{
ChangeWindowMode(TRUE);
DxLib_Init();
while (!ProcessMessage() && !CheckHitKey(KEY_INPUT_RETURN)) {
//いろいろな処理
}
DxLib_End();
return 0;
}
Re:リターンで終了するには??
do{
end = getchar();
}while(end != '\n');
でやってるんですけど、リターン押す前に終わってしまうんです。
end = getchar();
}while(end != '\n');
でやってるんですけど、リターン押す前に終わってしまうんです。
Re:リターンで終了するには??
おそらくストリームに残った改行文字を読み込んでしまっているのだと思います。
ループの中でscanf 関数などを呼び出している部分があれば、その部分も書いてみてください。
ループの中でscanf 関数などを呼び出している部分があれば、その部分も書いてみてください。
Re:リターンで終了するには??
短いので、全部書いてみました。お願いします。
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 );
}
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:リターンで終了するには??
scanf関数で数値を入力する際の動作を思い出してみてください。
1:任意の数字を押す
2:エンターを押す
という順番で操作しますよね?
実は、2で実行された「エンターキーが押された」という情報はscanf関数では処理されずに残っています。なので、natuさんの書かれたプログラムでは入力待ち状態になった瞬間に残っていた「エンターキーが押された」という情報を読み取って終了してしまっていた訳です。
という訳で、その情報をgetchar関数を使って空読みして処理して解決したという訳です。
1:任意の数字を押す
2:エンターを押す
という順番で操作しますよね?
実は、2で実行された「エンターキーが押された」という情報はscanf関数では処理されずに残っています。なので、natuさんの書かれたプログラムでは入力待ち状態になった瞬間に残っていた「エンターキーが押された」という情報を読み取って終了してしまっていた訳です。
という訳で、その情報をgetchar関数を使って空読みして処理して解決したという訳です。
Re:リターンで終了するには??
そういう訳ではありません。使い方を間違えなければ全く問題ないです。
たしかに、scanf系の関数を嫌って使わない人もいますけどね…。
まぁ、その辺は好みの問題かと思います。
たしかに、scanf系の関数を嫌って使わない人もいますけどね…。
まぁ、その辺は好みの問題かと思います。
Re:リターンで終了するには??
while(end != '\n');
この部分がマズイですね。エンターキーのアスキーコードはおそらく0x0dだったはずなので…
while(end != 0x0d);
に変更してみてください。
この部分がマズイですね。エンターキーのアスキーコードはおそらく0x0dだったはずなので…
while(end != 0x0d);
に変更してみてください。
Re:リターンで終了するには??
Windowsプログラミングならウィンドウプロシージャに記述すればいいです
case WM_KEYDOWN: switch(wParam){ case VK_RETURN: DestroyWindow(hWnd); break; } break;
Re:リターンで終了するには??
stdinでfgetsしてsscanfで面倒なことが一気に解消するのだけど中間にバッファが必要だから(初心者向けには)避けられているのでしょうかね。