0

ファイルからコマンドを読み取って注文を受け入れるプログラムがあります。このファイルでは、いくつかのコマンドは "1.0"、"2.0" のような "float string" ですが、それらは無効です。プログラムが必要とするのは "1"、"2" のような整数です。では、「1.0」などのコマンドが無効であることをプログラムに理解させるにはどうすればよいでしょうか。これを行うためのきちんとした方法はありますか?

    char buf[CMDSIZE];
    if(fgets(buf, CMDSIZE, stdin))      //buf likes this: "1.0 \n"
    {
        *prio = 1; *command = -1; *ratio =1.0;
        // I need to make sure that command is not "1.0" or something like this              
        sscanf(buf, "%d", command);
        switch(*command){....blahblah......}
    }

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

4

4 に答える 4

3

scanf("%d"....)との両方scanf("%f"....)が成功し、入力1.0を読み取るときに 1 を返します。(sscanf も同じように動作します。) ただ、 を使用すると"%d"、小数点の前で読み取りが停止します。

sscanfでフォーマット指定子を使用して、%n読み取られた文字数を確認し、後でバッファにさらに内容が含まれているかどうかを確認できます。

または、sscanf の代わりに独自のコードを使用してバッファーの内容を調べて、そこに数字しかないかどうかを確認する方が簡単かもしれません。

于 2012-05-24T06:54:13.703 に答える
3

より使いやすくなりましたstrtol

これは、10 進数の整数を解析します。ポインターeは、整数の後の最初の文字を指します。それが NUL バイトであることを確認し、それ以外の場合はエラーを通知できます。(入力が空でないことも確認する必要があります。)

数字の後にスペース/改行を許可したい場合は、それも可能です。strtol先頭の空白を消費しますが、末尾の空白は消費しないことに注意してください。

long v;
char *e;
v = strtol(buf, &e, 10);
if (!buf[0] || *e) {
    error();
}
// v has number

脚注:でのオーバーフローとアンダーフローのチェックstrtolは少し奇妙です。最初に 0に設定errnoし、 を呼び出してstrtolから、結果がLONG_MINまたはLONG_MAXerrno設定されているかどうかを確認する必要がありERANGEます。

于 2012-05-24T07:04:52.887 に答える
0

%f で scanf を使用して浮動小数点値の例として保存するか、%d でスキャンして整数として保存できますが、小数はカウントされません。

#include<stdio.h>
main()
{
float i;
int a;
printf("Enter a number which is a floating point value");
scanf("%f,%d",&i,&a);
}

ここではscanfと%fを使用してfloat変数に格納しています。つまり、1.5、1.0または小数を含む任意の数値が格納されます。または、%dのみを使用する場合は、1、2、3、4のみを格納します。 10 進数、つまり 2.5 を指定すると、2 しかかかりません

于 2012-05-24T07:33:30.360 に答える
0

あなたの特別なケースでは、 1 と 1.0 の違いを確認するには、次のコードを使用します。

int ret = scanf("%d.%d",&i,&j);

入力が 1 の場合、scanf は 1 つの値のみを割り当てます。入力が 1.0 の場合、ret は 1 です。scanf は 2 つの値を割り当てます。ret は 2 です。入力が abcd の場合、scanf は値を割り当てることができません。ret は 0 です。

また、scanf、fscanf などの戻り値について。

C99 標準 7.19.6.4 では scanf 関数

scanf 関数は、変換前に入力エラーが発生した場合、マクロ EOF の値を返します。それ以外の場合、scanf 関数は割り当てられた入力項目の数を返します。初期の一致に失敗した場合は、指定された数より少ないか、0 になることもあります。

于 2012-05-24T07:19:21.577 に答える