scanf構文 - %6dおよび%-6dおよび%0d
-
24-10-2019 - |
質問
使用の違いは何ですか scanf
次の形式の指定器を使用すると、スキャンされる入力がある場合 123456
それがそうであるときと 123
:
%6d
%-6d
%0d
出力の違いは何ですか?
解決
私はGCC 4.3.4で試してみましたが、以下を手に入れました。
%6d
: : 正常に動作します; 6文字のみを読みます(したがって、読み込もうとした場合123456789
それは読むだけです123456
)%-6d
: :警告を発します:warning: unknown conversion type character '-' in format
何も読んでおらず、書かれているintは変更されていません
%0d
: :警告を発します:warning: zero width in scanf format
形式の仕様に幅がないかのように読み取ります(
%d
)
これらの結果が義務付けられているかどうか、またはGCCがそれを処理する方法を確認するために仕様をチェックしていません(編集: アンドレイトはそれを見つけました)
他のヒント
%-6d
無効なフォーマット仕様です。フォーマット仕様はありません -
それらに scanf
.
の %6d
6
部分は呼ばれます 最大フィールド幅. 。それはすべてのフォーマット仕様で動作します( d
)そして、フォーマット固有の変換が実行される前に、読み取る最大文字の数を指定します。たとえば、入力シーケンスの場合 1234567
, 、 それから %3d
読み、変換します 123
と %6d
読み、変換します 123456
.
%0d
無効なフォーマット仕様です。最大フィールド幅 scanf
ゼロ以外の整数でなければなりません(言語仕様の7.19.6.2/3を参照)。
それで、それは私たちを残します %6d
あなたが提供した3つの中の唯一の意味のあるフォーマット仕様として。これらの状況下では、出力の違い(結果で)の質問はほとんど意味がありません。
編集: おそらくそれを主張することができます %-6d
-6
一部は最大フィールド幅であり、標準的な要件を満たすことです 非ゼロ10進整数. 。ただし、C言語用語ではa 10進整数 語彙要素は、数字と数字のシーケンスのみです。サインを含めることは許可されていません。つまり、どちらでもありません -6
または +6
小桁です。あなたが使用するたびに -6
また +6
あなたのプログラムの整数として、それは実際には単位です -
と +
オペレーターの語彙体に続いて、10進数整数lexemeが続きます。したがって、の仕様以来 scanf
aが必要です 非ゼロ10進整数 最大フィールド幅として、それは署名のない整数でなければなりません。
私が起こると思うことは次のとおりです。%6Dは、数の最初の6桁を取得します。%-6Dは、おそらく予想通りに機能しません。 %0Dは、0文字しか必要ないことを意味しますが、これはおそらく期待どおりに機能しません。
両方 %-6d
と %0d
それは 無効 の変換仕様 scanf
, 、したがって、これらの場合の動作はそうです 未定義. 。言語を参照してください 標準, § 7.19.6.2, ¶ 3.
Arkadiyのように、あなたは「出力」を参照するので、あなたが本当にprintfスタイルのフォーマットを意味すると思います。また、Cを使用していると仮定します(タグが示唆するように)。
実行する場合:
printf("%6d %-6d %0d", num1, num2);
... 3つの形式の引数を十分に提供していないため、コンパイラエラー(またはさらに悪いことに、ランタイムバグ)になります。
しかし、それはあなたが尋ねていたものではないと感じています。あなたが実際に実行すると仮定しましょう:
// (I've added some extra stuff to show how the formatting works.)
printf("'%6d'/'%-6d'/'%0d'", num2, num2, num2);
...あなたは得る:
' 123'/'123 '/'123'
通常、フィールド幅(この場合は6)が十分に広い場合、数字は右に整列され、スペースパッドが付いています。フィールド幅の前に「 - 」を配置すると、それらは右に調整され、スペースパッドされます。
ここの微妙さは「%0D」形式です。あなたはゼロ幅フィールドを指定していると思うかもしれません...そしてあなたは間違っているでしょう。 「%」の後の最初のものはオプションフラグであり、「0」は有効なフラグです。それは、「フィールド幅がコンテンツよりも広く、左パッドがゼロである場合」を意味します。この場合、フィールド幅を提供していません(「0」はフラグです、覚えていますか?)。したがって、「0」フラグには効果がありません。フィールドはコンテンツが必要とするほど広くなります。
しかし、さらに悪い微妙さがあります。 「%-06D」を指定した場合、ゼロで右パッディングを取得しますよね?いいえ。 「 - 」フラグは、「0」フラグを無効にします。 「123」を取得します。