C言語関係掲示板

過去ログ

No.468.数字以外のものが入力されたときのエラー処理

[戻る] [ホームページ]
No.3387

getsとsscanfを用いたエラー処理について
投稿者---Ken(2002/11/09 02:52:42)


キーボードから数字以外のものが入力されたときのエラー処理として
char temp[20];
double value;

gets(temp);
if(sscanf(temp,"%lf",&value) != 1){
printf("エラー");
return;
}
のように書きました。これだと、例えば「a」を入力するとちゃんと、
エラーを返してくれるのですが、「123a」のように入力すると、sscanfは123の部分を正常に読み込んで、返り値を1としてしまうので、エラーが出力されません(valueに123が入る分には問題ないのですが)。このように数字プラス数字以外の入力がきたときに、エラーを検出するには、どのようにすればいいのか教えて頂けないでしょうか。
よろしくおねがいします。

No.3388

Re:getsとsscanfを用いたエラー処理について
投稿者---aki(2002/11/09 11:37:05)


#include <stdio.h>

int main(void)
{
    char temp[20], c;
    double value;

    gets(temp);
    if(sscanf(temp, "%lf %c", &value, &c) != 1) {
        printf("エラー");
        return 1;
    }
    return 0;
}

上のfscanfの書式 "%lf %c" の意味は次の通りです。

"%lf"   空白類文字(スペース、タブ、改行など)があれば、まずそれを読み飛ばす。
        その後、double型の浮動小数点数を読み取る。

" "     (もしあれば)空白類文字を読み飛ばす。

"%c"    一文字だけ読み取る。ただし文字列終端の'\0'の読み取りは失敗する。

fscanfの戻り値は代入された入力項目の個数なので、下の入力例に対する
戻り値はそれぞれのようになります。

入力  : a
戻り値: 0

入力  : 100
戻り値: 1

入力  : 100   (後ろに空白)
戻り値: 1

入力  : 100a
戻り値: 2

入力  : 100 a
戻り値: 2

でもこのプログラムはLSICではちゃんと動かないみたいです。


No.3389

Re:getsとsscanfを用いたエラー処理について
投稿者---Ken(2002/11/09 13:05:08)


akiさん,ありがとうございます.
教えていただいた通りにやったら,無事解決できました.
LSICで動かないというのは不思議な感じががしますが,いまのところ,Borland製とMicrosoft製のコンパイラしか使っていないので大丈夫です.

実は,この質問はかなり前から自分の中にあったのですが,なかなか質問できるところがなかったので,解決できて大変うれしいです.
本当にありがとうございました.