web-dev-qa-db-ja.com

sscanf( "123456789123456789123456789"、 "%d"、&n)には動作が定義されていますか?

sscanf()またはscanfファミリーの別の関数に、変換された値がターゲットの整数型の最大値を超える一連の数字が与えられた場合、

  • 変換が失敗したと見なす必要がありますか?
  • 行動はまったく定義されていますか?

標準から、7.21.6.2p10((f)scanf、ファミリー全体に適用):

…このオブジェクトに適切なタイプがない場合、または変換の結果をオブジェクトで表現できない場合、動作は未定義です

scanfファミリーに対して非常に慎重になる別の理由のようです。 strtoXX関数には、完全に定義された動作があります。入力が大きすぎる場合はLONG_MAXなどを返し、errno == ERANGEを設定します。したがって、正確な情報が必要な場合は、入力を手動でトークン化し、これらの関数を使用して変換します。別の利点:エラー処理の改善。