help

IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
#include <stdio.h>
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";
main()
{
printf(s,34,s,34);
}

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

how does this work???
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
It's all in the printf format string. The first parameter to printf is s, the string itself.
So this is equivalent to:
Code:
#include <stdio.h>
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";
main()
{
printf("char*s=%c%s%c;main(){printf(s,34,s,34);}",34,s,34);
}
Now just match up the %-codes with the parameters:
%c=>34
%s=>s again
%c=>34.

34 is the ASCII code for ".
0
IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
ok..then for first %s...char*s=%c%s%c;main(){printf(s,34,s,34);} is printed..
then for %c .. " is printed... then
for the next %s..y only.. main(){printf(s,34,s,34);} is printed instead of entire char *s???
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
Sorry, don't understand. What output are you expecting and why?
0
IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
i expect the below to be output..
char*s=%c%s%c;main(){printf(s,34,s,34);}"char*s=%c %s%c;main(){printf(s,34,s,34);}"
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
What do you think the following code will display?
Code:
#include <stdio.h>
char*s="AAA %c %s %c BBB";
main()
{
printf(s,'\"',s,'\"');
}
0
IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
i expect this..
AAA %c %s %c BBB" AAA %c %s %c BBB"
0
IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
got it...
s indicates... AAA %c %s %c BBB

so AAA " AAA %c %s %c BBB "

%c mapped to " n %s mapped to AAA %c %s %c BBB..
rite??
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
Oh I see. You're thinking that:
Code:
printf("A","B","C");
will print ABC, right? It won't. The first parameter to printf is called a format string. It contains text and symbols that indicate the meaning of the parameters that follow. So %c is a character, %s is a string, %d is a number, and there are lots more, so the code:
Code:
printf("Character:%c;  String:%s;  Number:%d\n", 'f', "Hello world", 27);
will display:
Character:f; String:Hello world; Number:27
and the \n means end of line.

So if we look at my second bit of code:
Code:
char*s="AAA %c %s %c BBB";
main()
{
printf(s,'\"',s,'\"');
}
printf will interpret the first parameter to mean:
"AAA ";
then a character because of %c;
then a string because of %s;
then another character because of %c;
then " BBB".

The %c, %s and %c match to '\"', s itself, and '\"' respectively, so the output will be:
"AAA ";
then '\"' because of %c;
then "AAA %c %s %c BBB" because of %s;
then '\"' because of %c;
then " BBB".

which in total will be:

AAA "AAA %c %s %c BBB" BBB".

It's a bit confusing because of the double usage of s. Let's specify the format string literally, and use "sausage" instead of duplicating the format string, and X instead of that escaped double quote.
Code:
char*s="sausage";
main()
{
printf("AAA %c %s %c BBB",'X',s,'X');
}
The output of this will be: AAA X sausage X BBB. Clear?
IndiraP like this
0
IndiraP's Avatar, Join Date: Nov 2012
Go4Expert Member
ya...u r wonderful sir...
thank u sir..i got it well...