VC++6.0を(初心者なのに)無謀にも購入したんですが、
クラスというのが全く理解できなかったのでコンソールアプリケーションから
作って見る事にしました。で、とりあえず、しょぼいのが出来たんですが
キーボードを押すまで処理を中断させる方法と、処理が終わった後キーボードを押すまでウインドウを閉じないようにする方法がわかりません。
初歩的な事でしょうが、初心者の私にはどこをどう調べたら良いかわからず困っています。どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

getch()を使えば勝手にキー入力待ちになりますので、


質問の答えとしてはkbhit()は不要です。

昔はキーボードでゲームをやろうとすると、
kbhit()とgetch()を組み合わせて使っていました。
アルタイムキー入力をやるために、
kbhit()が必要だったわけですが、
今回の場合はキー入力を待ちたいわけですから、
単に...

_getch();

だけでうまくいくと思います。
    • good
    • 1
この回答へのお礼

ありがとうございますKOH_daさん。
かなり悩んでやっとあそこに辿り着いたんですが、少し?違ってたみたいです(^_^;)
初めはキー入力を待つためにscanfでいろいろ試してたんですが全くもって
うまくいかなかったんで質問して正解でした。

>昔はキーボードでゲームをやろうとすると、
>kbhit()とgetch()を組み合わせて使っていました。
頑張っていつかゲームみたいな物を作ってみたいと思います。
またよろしくお願いします。

お礼日時:2001/03/31 04:04

えっと、kbhit()を使う理由なのですが…。


質問文に“キーを押した時”とあったので「入力文字は必要無い」と判断していました。
純粋に「キー入力があったこと」を報告する関数がkbhit()で入力した値を取りこむ関数がgetch()です。


> コンソールアプリケーションでしか使えないと言う事でしょうか?
getch()、kbhit()共にANSI標準ライブラリ関数ではないのでWindowsのMS-DOSプロンプト(WindowsNTY/200のコマンドプロンプト)とMS-DOSのみで利用可能と考えた方が良いでしょう。
    • good
    • 0
この回答へのお礼

toysmithさん、ありがとうございます。
>質問文に“キーを押した時”とあったので「入力文字は必要無い」と判断していました。
はい、その通りです。特に入力文字を表示させるまでは考えてませんでした。
Helpにもtoysmithさんと同じことが書かれていました。
結果、ああ言う風になったんですが・・・初心者には難しいですね(^_^;)
とりあえず、ここで教えていただいた事を頑張ってやってみます!
勉強になりました。
またよろしくお願いします。

お礼日時:2001/03/31 03:49

while( !_kbhit() ){}


_getch();

上の while(~){} は不要ですよ。
_getch() だけでプログラムは停止します。
_getch() の使い方はコンソールアプリで使うキー入力なのでこれで OK です。
    • good
    • 0
この回答へのお礼

haru-pさんありがとうございます。
Helpに_kbhit()がキー入力みたいな事が書かれていたので必死の思いで
これに辿り着いたんですが・・・。

while( !_kbhit() ){} ←何かのキーを押すまでループ
_getch(); ←キー情報を開放
のような感じで一人で納得してました。
実はいらなかったんですね、while( !_kbhit() ){}
これから書き直そうと思います。
またよろしくお願いします。

お礼日時:2001/03/30 22:25

コンソールアプリケーション(Windows上の)に依存する方法です。


移植性はありませんので御注意ください。

kbhit()または_kbhit()で「キーを押した」事がわかります。
キー入力が確認されたらgetch()または_getch()で入力文字を取りこみます。

アプリケーション終了時なら文字を取りこむ必要が無いのでkbhit()で入力待ちすれば良いでしょう。

この回答への補足

とりあえず、

   while( !_kbhit() ){}
_getch();

と書いたら中断することが出来ました。
何か使い方が間違ってるような気がするんですが、
もっといい方法があれば教えてもらえないでしょうか?
よろしくお願いします。

補足日時:2001/03/30 20:25
    • good
    • 0
この回答へのお礼

ありがとうございます、toysmithさん。

>コンソールアプリケーション(Windows上の)に依存する方法です。
>移植性はありませんので御注意ください。
コンソールアプリケーションでしか使えないと言う事でしょうか?

とにかく頑張ってやってみます。getch()で入力文字を取り込めばprintfなどで
表示させられるということですね。ありがとうございました。
結果を報告したいので締め切りはもう少し待ってください。

お礼日時:2001/03/30 17:38

「キーボードを押すまでウインドウを閉じないように」は、


メニュー [ビルド]→[アクティブな構成の設定]→[Win32 Debug]を選択して [OK] ボタンを押しビルドします。
そして、プログラムが閉じてしまいそうな場所(ソース上)へカーソルを移動させて [F9] キーを押してみて下さい。
左側に赤い●が付くでしょ。
[F5] キーを押してプログラムを実行させると、その●印のところで処理が中断されます。
例えばコンソールアプリであれば main の一番最後の return に●を付けて下さい。
<<プログラマが日常茶飯事に使う手法です>>

この回答への補足

とりあえず、

   while( !_kbhit() ){}
_getch();

と書いたら中断することが出来ました。
何か使い方が間違ってるような気がするんですが、
もっといい方法があれば教えてもらえないでしょうか?
よろしくお願いします。

補足日時:2001/03/30 20:23
    • good
    • 0
この回答へのお礼

ありがとうございます、haru-pさん。

こんな便利な方法があったとは・・・試して見ます。
一応、Helpなどある程度目を通したんですが、これまた嫌がらせの様に
専門用語の嵐でして理解しきれませんでした。
使い勝手もよろしくないような気がします。なれれば良いのかもしれませんが・・・。

またよろしくお願いします。

お礼日時:2001/03/30 17:28

私と同じレベルですね(笑)。


翔泳社から発売になっている本がわかりやすいと思います。
VisualC++(1)はじめてのWindowsプログラミング
山本 信雄著、2,600円+税です。
続編があと2冊ありますが、極めて退屈な本なので、
(1)だけ買うのが正解だと思います。

で、答えなんですが、
プログラムを終わらせなければ、窓は閉じないはずなので、
getch()でキー入力を待つようなプログラムを組めばいいと思います。

この回答への補足

とりあえず、

   while( !_kbhit() ){}
_getch();

と書いたら中断することが出来ました。
何か使い方が間違ってるような気がするんですが、
もっといい方法があれば教えてもらえないでしょうか?
よろしくお願いします。

補足日時:2001/03/30 20:15
    • good
    • 0
この回答へのお礼

ありがとうございます、KOH_daさん。

2,600円+税は今の私には手が出せません(T_T)
こういう本は何故かまるで嫌がらせのように高いですね。

getch()ですか・・・使い方がいまいちわかりませんが調べて見ます。
ありがとうございました。

お礼日時:2001/03/30 17:20

このQ&Aに関連する人気のQ&A

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

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

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

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

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の初心者です。
ある文字列をスクロールさせるプログラムを作りました。
ソースは以下です。
***********************************************
#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

QC言語で文字列をかえす正しい書き方が知りたいです?

C言語で次の警告が表示されます。
文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか?


jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。


char *test(char *a, int b)
{
char str[BUFSIZ];
return str; <------

}

Aベストアンサー

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び出し元でちゃんとfreeしましょう。

B-2.呼び出し元でメモリを確保するケース
(注意:同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{

...

return str;
}
これは#1の方の回答と同じです。

B-3.B-1/B-2の複合
(注意:NULL以外の同じアドレスを指定して複数回呼び出すと、メモリ内容は当然破壊されます)
char *test(char *str, ...)
{
if(str == NULL)
{
str = malloc(BUFSIZ);
if(str == NULL) return NULL; //エラー
}

...

return str;
}

こんなところですかね。

再入可能にするかどうかで、回答は変わります。

A.2度呼び出した場合に前のデータを破壊してもよいケース(再入不可能)

char *test(...)
{
static char str[BUFSIZ]; // static指定でメモリは静的に確保されます。

...

return str;
}

B.2度呼び出した場合に前のデータを破壊しないケース(再入可能)
B-1.mallocを使ってもいいケース
char *test(...)
{
char *str;
str = malloc(BUFSIZ);
if(str == NULL) return NULL; // エラー

...

return str;
}
この場合は、呼び...続きを読む

Qマルチスレッドについて

現在”猫でもできる”の87、88章を学んでおります。

まず87章でマルチスレッドの根本的なやり方を学びましたが、いきなり疑問が浮かびました。
_beginthread関数によりスレッドをスタートさせ、この関数で登録した関数内で_endthread関数を実行し終了させていることは分かります。
しかし_beginthread関数で登録した関数に引数を渡す処理がどの部分で行われているのかわかりません。
登録する関数はvoid型で引数はvoid*型でなければいけないことは分かったのですが、プログラムのどこを見てもこの登録した関数に引数を渡す処理が行われていません。
その辺の動作の説明を分かる方でいいのでよろしくお願いします。





そして88章では排他制御のマルチスレッドを行うプログラムの製作を行っているのですが、ちょっとした疑問が浮かびました。

EnterCriticalSection関数、LeaveCriticalSection関数ではさまれたプログラムは排他制御され他からアクセスされない。

この関数はこんな理解で良いんですかね?
この理解で行くと、88章で説明していきますが、子ウィンドウを2つ作成しそれぞれのプロシージャ内で排他制御された関数をスレッドとしてスタートしています。
この2つのスレッドの動作についてですが、互いに排他制御関数が記述されているため、動作としてはまず左の子ウィンドウのスレッドが処理されている場合、右の子ウィンドウのスレッドは停止している。そして左の子ウィンドウのスレッドの排他制御が解放されたときに、右の子ウィンドウのスレッドが開始する。
そしてあるとき左の子ウィンドウのクライアントウィンドウ内で右クリックされた場合、その時点で排他制御されたスレッドが終了するのを待ち、終了したらcountを+1する。
こんな動作が行なわれていると理解してよいのでしょうか?

現在”猫でもできる”の87、88章を学んでおります。

まず87章でマルチスレッドの根本的なやり方を学びましたが、いきなり疑問が浮かびました。
_beginthread関数によりスレッドをスタートさせ、この関数で登録した関数内で_endthread関数を実行し終了させていることは分かります。
しかし_beginthread関数で登録した関数に引数を渡す処理がどの部分で行われているのかわかりません。
登録する関数はvoid型で引数はvoid*型でなければいけないことは分かったのですが、プログラムのどこを見てもこの登録し...続きを読む

Aベストアンサー

ANo.5です。

>「1%の絶妙なタイミング」といっているのは極端に短い実行時間を持つ右スレッドが実行状態のときにクリックされた場合のことをいっているんですよね?

その通りです。
とはいえ、カーネルはブラックボックスなので、あてにならない話として受け取っていただければと思います。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qスレッド処理からダイアログを表示するには?

Windows XPとVC++ 6.0で
時間のかかる大量の計算をするプログラムを作っています。

計算部分はスレッド処理にして
進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの)
を表示します。

・CWinAppのInitInstanceで計算処理開始(AfxBeginThread)
・計算処理内で進捗ダイアログをCreate
・計算の進み具合によって進捗ダイアログのプログレスバーを更新

上記の流れではうまくいっていたのですが
以下のように変更したところ、進捗ダイアログをCreateするところで
プログラムが応答なしになってしまうようになりました。

・メインダイアログ(モーダル)
・メインダイアログのAボタンクリックでダイアログAを開く(モーダル)
・ダイアログAの実行ボタンクリックで計算処理開始(AfxBeginThread)
・計算処理内で進捗ダイアログをCreate
・計算の進み具合によって進捗ダイアログのプログレスバーを更新

MFC Wizardでダイアログベースで作成、MFCの共有DLLを使用しています。

モーダルダイアログ→スレッド→CDialog.Createに
制限があったりするのでしょうか。
どうかご教授ください。

Windows XPとVC++ 6.0で
時間のかかる大量の計算をするプログラムを作っています。

計算部分はスレッド処理にして
進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの)
を表示します。

・CWinAppのInitInstanceで計算処理開始(AfxBeginThread)
・計算処理内で進捗ダイアログをCreate
・計算の進み具合によって進捗ダイアログのプログレスバーを更新

上記の流れではうまくいっていたのですが
以下のように変更したところ、進捗ダイアログをCreateするところで
プログラムが応答なしになっ...続きを読む

Aベストアンサー

スレッドを作成した側の待機処理ループの中にメッセージポンプを作成してやればよさそうですよ

pThread->ResumeThread();
do {
  AfxGetApp()->PumpMessage();
} while( WaitForSingleObject( pThread->m_hThread, 0 ) != WAIT_OBJECT_0 );
といった具合で …

メインスレッド寝てしまっているので反応無しになるのかも

Q特定のキーを押すまでループさせるにはどうすればよいですか。

たとえば、ESCキーとか、Qキーを押すまで、一定のことを繰り返し行わせるためには、具体的にどのようなコードを書けばよいでしょうか。
Do While...LoopやDo...Loop Whileを使えばよいのは分かるんですが、キー入力を取ってきて、そのキー入力がESCかどうかの比較をする部分などがよくわかりません。具体的なコードを見せていただけると助かります。
よろしくお願いします。

Aベストアンサー

いろんなやり方があるかもしれませんが、私ならモジュールレベル変数とか
Public変数とかの「フラグ」を使って制御しますかね。
以下は、EscapeかQキーを押すまで、ひたすら数値をカウントアップしていく
プログラムです。細かいエラー制御とかはしてませんのでご了承を。
あ、VB2005 Expressで書いてます。他のバージョンだと(特にVB6とか)
改造しないと動かない可能性があります。
(今後、バージョンは明記して下さいね…)
あと、Do~Loopとかを使うと基本的にフルパワーでループしてしまうので
(DoEvents入れたら、フリーズまでは しないですが)、繰り返し処理を
している状況をユーザに見せたりする場合は適しませんので、
今回はタイマーを使ってます。

Form1にLabel1、Timer1を貼り付けて、以下のソースを貼り付けてください。

Public Class Form1

'表示用カウンタ
Private Counter As Integer = 0
'取得した、特定の入力キー
Private InputKey As System.Windows.Forms.Keys = 0

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Timer1.Start()
End Sub

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
'既に入力キーが登録されていれば何もしない
If InputKey <> 0 Then Exit Sub

Select Case e.KeyCode
Case Keys.Q, Keys.Escape
'入力キー登録
InputKey = e.KeyCode
End Select
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Select Case InputKey
Case Keys.Q, Keys.Escape
Timer1.Stop()
Exit Sub
End Select

Counter += 1
Label1.Text = Counter.ToString
End Sub

End Class

上の例では、InputKeyがフラグの役目を果たします。
InputKey関連の処理を行っているSelect Caseを改造する事で、いろんな事が
出来ると思いますよ。

いろんなやり方があるかもしれませんが、私ならモジュールレベル変数とか
Public変数とかの「フラグ」を使って制御しますかね。
以下は、EscapeかQキーを押すまで、ひたすら数値をカウントアップしていく
プログラムです。細かいエラー制御とかはしてませんのでご了承を。
あ、VB2005 Expressで書いてます。他のバージョンだと(特にVB6とか)
改造しないと動かない可能性があります。
(今後、バージョンは明記して下さいね…)
あと、Do~Loopとかを使うと基本的にフルパワーでループしてしまうので
(Do...続きを読む

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

Qテキストファイルの行数を取得する方法(C言語

C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

宜しくお願いします。

Aベストアンサー

>C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

 3つ前の質問 http://okwave.jp/qa5129642.html 質問文中のソース冒頭 line2++; 部分(下に修正したもの掲載)で、

・テキストファイルの行数を、ファイルの頭から1行ずつ「読み捨て」て、それをファイル終端まで繰り返すことで数えています。

 ここでは、「全体として、どの位メモリを確保したらいいか」という動機から、超みっともない?こと(読み捨て、1ファイルを2度オープン)をしています。
  (本人には、http://okwave.jp/qa5114580.html の No.3 で指摘済み)
 1行ずつ読み込みながら、1行分のメモリを追加確保していくのが普通だと思うのですが・・。

・エディタでファイルを開けば判ることを、わざわさプログラムにする理由はなく、(質問文には現れない)主目的との「兼ね合い」でご質問された、と思います。
・「何々したいから、プログラムの冒頭で、ファイルのトータル行数を取得しておきたい」の「何々」部分を明らかにすれば、「兼ね合い」を解消する技法について「回答」が得られるかもしれません。

もし、上の質問者様と同様な動機でしたら、少なくとも、「エディタでファイルを開き、行数を確認」し、プログラム実行時にコマンドラインで、argv[ 2 ] に行数が入るようにして下さい。
超みっともない「読み捨て、1ファイルを2度オープン」は不要となります。

プログラムでは、line2 = atoi( argv[ 2 ] ); とすることで、行数を得ることができます(ファイル名は、argv[ 1 ] で)
----------------------------------------------
直球回答

int line2 = 0;
char buf[ 1024 ]; // 最大レコード長より大きいこと
FILE *fp;

if( NULL == ( fp = fopen( argv[ 1 ], "r" ) ) ){

 printf( "%s が開けません\n", argv[ 1 ] );

 return( -1 );
}
while( NULL != fgets( buf, 1024, fp ) ){

 line2++;
}
fclose( fp );

>C言語でテキストファイルのトータル行数を取得する関数又はその方法を教えてほしいのですが。

 3つ前の質問 http://okwave.jp/qa5129642.html 質問文中のソース冒頭 line2++; 部分(下に修正したもの掲載)で、

・テキストファイルの行数を、ファイルの頭から1行ずつ「読み捨て」て、それをファイル終端まで繰り返すことで数えています。

 ここでは、「全体として、どの位メモリを確保したらいいか」という動機から、超みっともない?こと(読み捨て、1ファイルを2度オープン)をしています。...続きを読む

Q標準出力の上書き

C言語にていての質問です.

一度標準出力に出力した文字の上に上書きして出力することは可能でしょうか?
例えば,カウントダウンするとき
「10」を出力したあとに,同じ部分に「半角空白+9」を出力できますか?
printf("10");printf(" 9");では「10 9」になってしまいますよね.

よろしくお願いします.

Aベストアンサー

>printf( " %d\r", i );
ではなく
printf( "%d \r", i );
でなければならない。

カウントダウンし
_10
の上に
_9
を上書きすると
_90
になってしまう( _ は空白の意味)

なので、\rの前に空白を1つ入れて
10_
の上に
9_
を上書きするようにしないと
9__
になってくれない。

「桁が減った時に、画面上に残ってる前の数字が消えるように、数字の次に空白を入れる」のを忘れないように。

例えば
1.02
1.01
1
0.99
0.98
0.97
の、1.01から1になる時のように、一気に3文字も短くなる場合は
1.02___
1.01___
1___
0.99___
0.98___
0.97___
と言う感じで、末尾に3個の空白を入れないと、1つ前の文字が残ってしまう。


人気Q&Aランキング