次のコードを考えてみてください:printf文字(%c、%d)を関数の引数として渡す方法はありますか?
#include <stdio.h>
void printStrGeneric(void *, int, int);
void printNumGeneric(void *, int, int);
int main()
{
int intArray[] = { 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85 };
printNumGeneric(intArray, sizeof(intArray), sizeof(int));
printStrGeneric(intArray, sizeof(intArray), sizeof(int));
puts("");
short shortArray[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 };
printNumGeneric(shortArray, sizeof(shortArray), sizeof(short));
printStrGeneric(shortArray, sizeof(shortArray), sizeof(short));
puts("");
return 0;
}
void printStrGeneric(void *object, int size, int elem_size)
{
char *p = (char *) object;
while (p < (char *) object + size) {
printf("%c\t", *p);
p += elem_size;
}
puts("");
}
void printNumGeneric(void *object, int size, int elem_size)
{
char *p = (char *) object;
while (p < (char *) object + size) {
printf("%d\t", *p);
p += elem_size;
}
puts("");
}
- 機能printStrGeneric
とprintNumGeneric
は(printf
文字を除く)はほぼ同一であることを考えると、私は、それだけではなく、1機能を持たせることができ、任意の方法であるかどうかを疑問に思います関数に引数としてprintf
文字(%c
または%d
のいずれか)を渡しますか?
はい。書式指定子は単なる文字列です。これをパラメータとして関数 – OldProgrammer
に渡すことは可能ですが、フォーマット文字列に文字列リテラル以外のものを使用すると[セキュリティ上の脆弱性](https://en.wikipedia.org/wiki/Uncontrolled_format_string) )。 – 0x5453
引数がプログラマから来ている限り、私はそれが最初からprintfよりもセキュリティ上のホールではないことはわかりません。 printfの実際のセキュリティ問題は、ユーザーが取得した文字列を書式文字列として渡すことに由来します。 – SoronelHaetir