私はこのようなものを持っています
char string[]="My name is %s";
printf("%s",string,"Tom");
出力は次のようになるとMy name is Tom
思いますが、My name is %s
キャラクターをエスケープしてみました%
が、うまくいきません。
ここで何が問題になっていますか?どうすれば%s
内部を手に入れることができ%s
ますか?
私はこのようなものを持っています
char string[]="My name is %s";
printf("%s",string,"Tom");
出力は次のようになるとMy name is Tom
思いますが、My name is %s
キャラクターをエスケープしてみました%
が、うまくいきません。
ここで何が問題になっていますか?どうすれば%s
内部を手に入れることができ%s
ますか?
このようなものを試してください
printf(string,"Tom");
あなたの方法の問題はこれです-
フォーマット文字列にフォーマット指定子が含まれるとすぐに、リスト内の次の引数が文字ポインタが指す文字列であると想定し、それを取得して、の代わりに出力printf
します。さて、再帰的な置換を
行わないので、そのままの状態であなたの残骸の中にあり、「トム」は今やただ捨てられる余分な引数です。%s
%s
printf
%s
string
printf
;の間の拡張は1つだけです。つまりprintf
、フォーマット文字列を除いて渡された文字列はすべて逐語的に印刷されます(あるとしても)。それは実際には良いことです。そうでなければ、大きなセキュリティホールが残るからです。
セキュリティリスクは、フォーマット文字列とパラメータリストが対応している必要があるという事実に関連しています。つまり、不要な%
ものがフォーマット文字列に到達すると、問題が発生します。
char ch[50];
fgets(ch, 50, stdin);
printf(ch);
ユーザーが提供する場合。%p %p %p %p
、彼はスタックに格納されているデータ(リターンアドレスなど)を読み取っています。彼が提供した場合%s %s %s
、彼はプログラムをクラッシュさせる可能性があります。彼が提供する場合%n
、彼はスタック上のいくつかのデータを上書きします。
とはいえ、必要に応じてフォーマット文字列を計算することもできます。
char ch[50];
char format_prototype[]="My name is %s";
snprintf(ch, 49, "%s", format_prototype);
ch[49]=0;
printf(ch, "Tom");
printf(string, "Tom")
多分?
の最初のパラメータprintf
はフォーマット文字列です。残りはすべて、フォーマット文字列に従ってフォーマットされるパラメータです。フォーマット文字列は決してネストしません。つまり、フォーマット対象の文字列にフォーマット命令が含まれていても、それは単に印刷され、別のフォーマット文字列として解釈されることはありません。
この種のフォーマットを間接的にしたい場合は、最初に新しいフォーマット文字列を生成する必要があります(sprintf
これは便利です)。
char string[] = "My name is %s";
char format[100];
sprintf(format, "%s", string);
次に、新しく生成されたフォーマット文字列を使用します。
printf(format, "Tom");
問題はprintf("%s",string,"Tom");
ラインにありますあなたが使用する必要があります
char string[]="My name is %s";
printf(string,"Tom");
ここでは、次のように出力を取得します
My name is Tom