Объясните фрагмент кода C: препроцессор + printf =? - PullRequest
2 голосов
/ 04 сентября 2010

Выход для этого фрагмента кода %s is a string is a string.Пожалуйста, объясните.

#include <stdio.h>

#define scanf "%s is a string"

int main()
{
    printf(scanf, scanf);  
}

Ответы [ 5 ]

6 голосов
/ 04 сентября 2010

Что именно вы хотите, чтобы мы объяснили?Замените макрос и получите

printf("%s is a string", "%s is a string");

Остальное - ожидаемое нормальное повседневное поведение printf.

PS #define scanf ... ???

2 голосов
/ 04 сентября 2010

Препроцессор делает слепую замену, чтобы дать:

printf("%s is a string","%s is a string");

%s в первом аргументе является спецификатором формата для строки и заменяется вторым аргументом. Во втором аргументе нет ничего особенного в %s.

1 голос
/ 04 сентября 2010

printf («% s - строка», «% s - строка»);

Полагаю, путаница заключается в том, что printf будет делать со вторым% s. Чтобы очистить это, printf не является рекурсивной функцией. Если вы печатаете строку и эта строка имеет какой-либо идентификатор формата, она не считается идентификатором формата. Это считается простой строкой. Таким образом, в этом случае второй «% s является строкой» является простой строкой. % s в этой строке не является идентификатором формата.

Если у вас было что-то вроде printf («% s% s - строка», «% s% s - строка»); Тогда да, вы получите ошибку во время выполнения, сообщающую, что в printf отсутствует какой-либо аргумент.

1 голос
/ 04 сентября 2010

Это довольно странный код, но вывод будет "% s строка является строкой", потому что scanf расширяется до "% s строка" в обоих случаях, а затем printf заменяет его на% s .

0 голосов
/ 06 января 2018

, чтобы понять этот код, выполните следующие инструкции один за другим: -

printf("%s is a string","StRiNG");
printf("%s %s is a string","StRiNG");
printf("%s is a string","StRiNG","Hey");
...