3

に収まる値である必要がある 10 進数のファイルがあるとしますがint、このファイルの内容をプログラムで検証して、オーバーフローをチェックしたいとします。数字のいずれかが整数をオーバーフローするかどうかを確認する簡単な方法はありますか?

元。ファイル -

name:  test.txt
value: 4343214321423142314

ループして実行fscanf(fd, "%d", &myint)すると、成功したことを示すメッセージが返されますが、myint に格納されている数値は正しくありません。

同様に、それを文字配列に読み込んでfscanf(fd, "%s", &mystr)やみくもに呼び出すatoi(mystr)と、成功は返されますが、結果は正しくありません。

それを文字列に読み込む 2 番目の例を考えると、次のようなことが可能になります。

char buf[11] = {'\0'};
sprintf(buf, "%d", INT_MAX);

fscanf(fd, "%s", &mystr); 
if(strcmp(mystr, buf) > 0)
    // handle error case

しかし、追加の配列と文字列比較関数を必要とせずにこれを行う簡単な方法はありますか?

4

4 に答える 4

2

使ってみませんか

fscanf(fd, "%d%n%c", &myInt, &pos, &nextChar);

次に、posそれが期待される場所であり、次の文字が数字ではないことを確認しますか?

于 2012-11-05T14:57:24.310 に答える
2

おそらく、整数を文字列に読み取ってから、 を使用できますstrtol。次に、結果のタイプに応じて、2 つのソリューションがあります。

  • long:LONG_MINまたはが返された場合は、値をLONG_MAXチェックして、数値がオーバーフローしているかどうかを確認できます。errnoERANGE
  • int: よりも大きいINT_MINか小さい数値を返す場合は、その数値を変数INT_MAXに安全に入れることができます。int
于 2012-11-05T14:55:01.137 に答える
1

はい、使用しstrtol()ます。オーバーフローが原因で変換が失敗した場合の動作は明確に定義されています。入力値が実際には符号なしであることがわかっている場合は、 を使用しますstrtoul()

于 2012-11-05T14:55:35.510 に答える
1

scanf(3)のマニュアル ページによると、変換はerrnoset toで失敗します。

エレンジ

整数変換の結果は、対応する整数型に格納できるサイズを超えます。

あなたの場合。したがって、scanforの結果を確認してfscanfを使用しますerrno

于 2012-11-05T14:55:44.670 に答える