Re: Strange C programming problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On Sat, Jul 14, 2007 at 12:52:09PM -0400, Michael Velez wrote:
> 
>  
> 
> > I've got this little program I wrote to test something, and 
> > it keeps giving the wrong result. I'm not inexperienced in C, 
> > but I can't believe strtof (et al) are broken, so I must be 
> > doing something wrong. However, I've spent hours looking at 
> > this and comparing it to the man pages and don't see what I'm 
> > doing wrong. strtod() and strtold() also give equally wrong 
> > results. (the example program given on the strotd man page 
> > works fine, BTW.)
> > 
> > Can someone wield a clue-bat please? :)
> > 
> > Here's the program:
> > 
> > #include <stdio.h>
> > #include <math.h>
> > #include <stdlib.h>
> > #include <errno.h>
> > 
> > int main (int argc, char ** argv)
> > 	{
> > 	float ldbl = 0.0;
> > 	char * endp;
> > 
> > 	printf ("%s\n", argv[1]);
> > 
> > 	errno = 0;
> > 	ldbl = strtof (argv[1], &endp);
> > 	if (errno != 0)
> > 		printf ("strtof failed! errno=%d\n", errno);
> > 
> > 	printf ("%f\n", (double) ldbl);
> > 	printf ("%f\n", (double) strtof (argv[1], (char **)NULL));
> > 	printf ("%f\n", (double) atof (argv[1]));
> > 
> > 	return 0;
> > 	}
> > 
> > Compile it with:
> > 
> > 	cc -O0 -g -o x4 x4.c
> > 
> > then run it like this:
> > 
> > 	./x4 2.5
> > 
> > and I'd EXPECT it to produce this output:
> > 
> > 	2.5
> > 	2.5
> > 	2.5
> > 	2.5
> > 
> > but it actually produces this:
> > 
> > 	2.5
> > 	1075838976.000000
> > 	1075838976.000000
> > 	2.500000
> > 
> > the typecase of the arg in the 3 printf calls makes no 
> > difference. Remove it and the results are the same.
> > 
> > Using an input of something other than 2.5 changes the middle 
> > two lines in some way in which I haven't yet discerned a 
> > pattern, but the result is still highly bogus.
> > 
> 
> The following strtod line works fine on my system (CentOS 5, latest updates,
> x86_64):
> 
>  	printf ("%lf\n", (double) strtod (argv[1], (char **)NULL));
> 
> For strtof, the SYNOPSIS in the man page mentions you need to add:
> 
> #define _ISO_C99_SOURCE
> 
> Or
> 
> #define _XOPEN_SOURCE 600
> 
> Either line should be added before ALL include files (note there is a
> mistake in the synopsis. There should be no = sign in the define statement
> for _XOPEN_SOURCE).
> 
> The above #define lines enforces C99 compatibility rules, which is the
> revised ISO C standard which came out in 1999.  As a previous responder
> suggested, you can also specify -std=gnu99 or -std=C99 on the compile line.
> 
> Michael

Sorry, I forgot to mention that I'm using Centos 4.5. And the man
page here doesn't mention those #define settings. I'll give it a try,
thanks!

-- 
-------------------------------------------------------------------------------
 .----    Fred Smith   /              
( /__  ,__.   __   __ /  __   : /     
 /    /  /   /__) /  /  /__) .+'           Home: fredex@xxxxxxxxxxxxxxxxxxxxxx 
/    /  (__ (___ (__(_ (___ / :__                                 781-438-5471 
-------------------------------- Jude 1:24,25 ---------------------------------

Attachment: pgpYH9FoM83dX.pgp
Description: PGP signature

_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
http://lists.centos.org/mailman/listinfo/centos

[Index of Archives]     [CentOS]     [CentOS Announce]     [CentOS Development]     [CentOS ARM Devel]     [CentOS Docs]     [CentOS Virtualization]     [Carrier Grade Linux]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Linux USB]
  Powered by Linux