Существует только один расширение в течение printf
; это означает, что любые строки передаются в 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 только интерпретирует% в это первый аргумент, строка формата. – nos