scanf
スキャンされる入力が次の場合と次の形式指定子123456
を使用する場合の違いは何ですか123
。
%6d
%-6d
%0d
出力の違いは何ですか?
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がそれをどのように処理するかを確認するために仕様をチェックしていません(編集:AndreyTはそれを見つけました)
は%-6d
無効なフォーマット指定子です。にフォーマット指定子はありませ-
んscanf
。
この部分では、最大フィールド幅と呼ば%6d
れます。これは、(だけでなく)すべてのフォーマット指定子で機能し、フォーマット固有の変換が実行される前に読み取る最大文字数を指定します。たとえば、入力シーケンスが、の場合、は読み取りと変換を行い、は読み取りと変換を行います。6
d
1234567
%3d
123
%6d
123456
は%0d
無効なフォーマット指定子です。の最大フィールド幅はscanf
ゼロ以外の整数である必要があります(言語仕様の7.19.6.2/3を参照)。
だから、それは%6d
あなたが提供した3つの中で唯一の意味のあるフォーマット指定子として私たちを残します。このような状況では、出力の違い(結果は?)についての質問はほとんど意味がありません。
編集:%-6d
おそらく、その-6
部分には最大フィールド幅があり、これはゼロ以外の10進整数であるという標準的な要件を満たしていると主張することができます。ただし、C言語の用語では、語彙要素としての10進整数は、数字と数字のシーケンスのみです。標識を含めることは許可されていません。つまり、10進整数-6
でもありません。プログラムでまたは整数として+6
使用するたびに、実際には単項および演算子の語彙素の後に10進整数の語彙素が続きます。したがって、の指定では最大フィールド幅としてゼロ以外の10進整数が必要になるため、符号なし整数である必要があります。-6
+6
-
+
scanf
これが私が起こると思うことです:%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'を取得します。