Connecting Tech Pros Worldwide Forums | Help | Site Map

printf %n question

john
Guest
 
Posts: n/a
#1: Oct 31 '07
The code:

#include <cstdio>


int main()
{
using namespace std;

int i;

printf("%ld\n%n", 1, &i);

printf("==>%d\n", i);

printf("%ld\n%n", 123456, &i);

printf("==>%d\n", i);

}

in my system produces:

[john@localhost src]$ ./foobar-cpp
1
==>2
123456
==>7

[john@localhost src]$


I expected:

"[john@localhost src]$ ./foobar-cpp
1
==>1
123456
==>6
[john@localhost src]$ "



It looks like it increments the value written to i with 1 more, than it
should. Is this a bug of my compiler, or am I wrong?

tragomaskhalos
Guest
 
Posts: n/a
#2: Oct 31 '07

re: printf %n question


On 31 Oct, 09:42, john <j...@no.spamwrote:
Quote:
The code:
>
#include <cstdio>
>
int main()
{
using namespace std;
int i;
printf("%ld\n%n", 1, &i);
printf("==>%d\n", i);
printf("%ld\n%n", 123456, &i);
printf("==>%d\n", i);
>
}
>
in my system produces:
>
[john@localhost src]$ ./foobar-cpp
1
==>2
123456
==>7
>
[john@localhost src]$
>
I expected:
>
"[john@localhost src]$ ./foobar-cpp
1
==>1
123456
==>6
[john@localhost src]$ "
>
It looks like it increments the value written to i with 1 more, than it
should. Is this a bug of my compiler, or am I wrong?
Interesting - have never come across %n before:
Googling unearths (in http://www.cplusplus.com) :
"Nothing printed. The argument must be a pointer to a signed int,
where the number of characters written so far is stored."

So your sample is behaving correctly:
"1" + "\n" = 2 characters
"123456" + "\n" = 7 characters
as reported.



Jack Klein
Guest
 
Posts: n/a
#3: Nov 1 '07

re: printf %n question


On Wed, 31 Oct 2007 11:42:36 +0200, john <john@no.spamwrote in
comp.lang.c++:
Quote:
The code:
>
#include <cstdio>
>
>
int main()
{
using namespace std;
>
int i;
>
printf("%ld\n%n", 1, &i);
>
printf("==>%d\n", i);
>
printf("%ld\n%n", 123456, &i);
>
printf("==>%d\n", i);
>
}
>
in my system produces:
>
[john@localhost src]$ ./foobar-cpp
1
==>2
123456
==>7
>
[john@localhost src]$
>
>
I expected:
>
"[john@localhost src]$ ./foobar-cpp
1
==>1
123456
==>6
[john@localhost src]$ "
>
>
>
It looks like it increments the value written to i with 1 more, than it
should. Is this a bug of my compiler, or am I wrong?
You are wrong. You put the %n after the newline character in the
format string, so it is counted as well. Try putting the %n before
the \n.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html
Chip Coldwell
Guest
 
Posts: n/a
#4: Nov 1 '07

re: printf %n question


tragomaskhalos <dave.du.vergier@logicacmg.comwrites:
Quote:
On 31 Oct, 09:42, john <j...@no.spamwrote:
Quote:
>The code:
>>
>#include <cstdio>
>>
>int main()
>{
> using namespace std;
> int i;
> printf("%ld\n%n", 1, &i);
> printf("==>%d\n", i);
> printf("%ld\n%n", 123456, &i);
> printf("==>%d\n", i);
>>
>}
>>
>in my system produces:
>>
>[john@localhost src]$ ./foobar-cpp
>1
>==>2
>123456
>==>7
>>
>[john@localhost src]$
>>
>I expected:
>>
>"[john@localhost src]$ ./foobar-cpp
>1
>==>1
>123456
>==>6
>[john@localhost src]$ "
>>
>It looks like it increments the value written to i with 1 more, than it
>should. Is this a bug of my compiler, or am I wrong?
>
Interesting - have never come across %n before:
Very useful for IOCCC entries.

Chip

--
Charles M. "Chip" Coldwell
"Turn on, log in, tune out"
Somerville, Massachusetts, New England
Closed Thread


Similar C / C++ bytes