Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!iuvax!rutgers!columbia!cubmol!ping
From: ping@cubmol.BIO.COLUMBIA.EDU (Shiping Zhang)
Newsgroups: comp.lang.c
Subject: Re: A question...
Message-ID: <321@cubmol.BIO.COLUMBIA.EDU>
Date: 16 Aug 89 19:31:22 GMT
References: <1586@sunset.MATH.UCLA.EDU>
Reply-To: ping@cubmol.UUCP (Shiping Zhang)
Distribution: na
Organization: Dept. of Biology, Columbia Univ., New York, NY
Lines: 43

In article <1586@sunset.MATH.UCLA.EDU> tony@MATH.UCLA.EDU () writes:
>Hello netland:
>
>I seemed to have run into a strange problem in C that I can't quite 
>figure out.
>
>I'm just trying to convert a time value stored in a long integer 
>in the form 111753 into a more presentable format 11:17:53.
>
>The variables were declared as follows:
>
>	long        call_time ;
>	char        str_time[21],   local_str[21] ;
>
>In a while loop I got the data and did the following:
>
>	sprintf (local_str,"%06ld",call_time) ;
>	strncpy (str_time,local_str,2) ;
>	strcat  (str_time,":") ;
>	strncat (str_time,&local_str[2],2) ;
>	strcat  (str_time,":") ;
>	strncat (str_time,&local_str[4],2) ;
>	str_time[8]='\0' ;
>
>	fprintf (fp,"%s time = %06ld local_str = %s str_time = %s\n",
>			 	str_date,call_time,local_str,str_time) ;
>
Add the following line after strncpy() will fix the problem:

        str_time[2]='\0';

strcat and strncat append a copy of the second argument to the END of
the first argument, that means the appending begins at the NULL
character. strncpy() does not null-terminate str_time here
because the length of local_str is longer than 2. strncpy worked ok for
the first time because str_time was initiated to null for all
its members. But after the first round of the loop, str_time is filled
with non-null characters upto the 9th position WHERE strcat() and
strncat always begin appending. Then str_time[8]='\0' simply
cuts off what they have appended. That is why only the first two 
characters are changed.

-ping