-6

C言語では、次のプログラムのうち%5 %%ですが、方法がわかりませんか?

 printf("%6%5%%%78%");
4

3 に答える 3

6

これは未定義の動作であり、コンパイラ/プラットフォーム固有です。誤った引数を持つPrintf関数は、スタックから変数のリッピングを開始し、その後、何かが発生する可能性があります。

これが、コンパイラが通常これについて文句を言う理由です。

source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: spurious trailing '%' in format [-Wformat]
于 2012-10-01T15:52:30.207 に答える
3

Printf形式の文字列の後には、ここでは明らかに行われていない同数の引数を続ける必要があります。

printfフォーマット文字列に使用できるパラメータは次のとおりです。

%[flags][width][.precision][length]specifier

ここで、指定子は文字列の場合はs文字の場合はcなどです。その他はオプションです。

フラグは、左揃えまたは右揃えの+、-、0などのいずれかであり、いずれも質問に渡されません。

精度の前には。が付いているので、この例の場合は外れています。

見てみましょう

printf("%6%5%%%78%");
  • ここで、%の後の最初の引数はフィールドの幅、つまり6と見なされるため、出力されません。ただし、別の%を見つける代わりに、後者の指定子を期待します。標準では、%の後に%が続くとstdoutに出力されます。したがって、%が最初に印刷されます。%の効果が失われるため、5は正規数として扱われ、出力されます。

  • 次に、単一の%を出力する%%が表示されます。次は再び単一の%で、その後に78が続きます。これは幅として期待されているため、印刷されません。ただし、後者の別の%は、78の効果を無効にし、単一の%を出力します。

上記の評価を検証するために、ここにテスト文字列があります

printf("%6%4%3%2");

上記に準拠して%4%2を出力します。

詳細なリファレンス printf

于 2012-10-01T16:24:03.280 に答える
0

ここで起こりそうなことは次のとおりです。

  • printf 実装は、「%6d」などの有効な変換仕様の開始である可能性がある「%6」を認識します。
  • 次に「%」が表示され、これは有効な変換指定ではなくなります。この時点で、文字列は C 標準に準拠しておらず (たとえば、C 1999 7.19.6.1 8 は「完全な変換仕様は %% である必要がある」と述べています)、実装は何でもできます。この特定の実装は、「6」を無視し、変換仕様が「%6%」ではなく「%%」であるかのように動作するように見えます。したがって、標準出力に「%」を書き込みます。
  • 次に、printf の実装は「5」を認識するため、「5」を書き込みます。
  • 次に、「%%」が表示されます。これは、「%」が書き込まれる有効な変換仕様です。
  • 次に、「%78%」と表示されます。「%6%」と同様に、「%78」は有効な仕様を開始できますが、2 番目の「%」は間違っています。繰り返しになりますが、実装では「78」を無視して「%」と書きます。

他の C 実装では動作が異なります。プログラムの形式が正しくありません。C 標準に準拠しておらず、その動作は C 標準で指定されていません。

于 2012-10-01T17:00:35.503 に答える