Назначение спецификатора формата с помощью указателя внутри функции printf () - PullRequest
0 голосов
/ 16 августа 2011

Я не мог понять, как приведенный ниже программный код выводит это значение. Пожалуйста, помогите мне понять.

#include<stdio.h>
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";
int main()
{
        printf(s,34,s,34);
        return 0;
}

выход:

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Здесь на самом деле не используется макрос.Это просто простой вызов printf.Первым параметром для printf является строка формата.В этом случае это значение, определенное в глобальной переменной s.Символы формата %c%s%c предоставляются параметрами 34,s,34 ". Таким образом, строка просто печатается полностью из-за символа формата %s. И два 34 значения печатаются как символы двойных кавычек (через %c).

1 голос
/ 16 августа 2011

Ваше утверждение printf фактически эквивалентно:

printf("char*s=%c%s%c;main(){printf(s,34,s,34);}", 34, s, 34);
               ^ ^ ^

Я пометил спецификаторы преобразования ^.Они заменяются соответственно:

  • " - символом ASCII, соответствующим 34
  • содержимому *s
  • " - ASCIIсимвол, соответствующий 34
0 голосов
/ 16 августа 2011

Вы вставляете в качестве аргумента строку формата, поэтому вывод верен. % S заменяется фактическим форматом. PS: где макросы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...