From: Alicia Carla Longstreet Newsgroups: comp.os.msdos.djgpp Subject: Re: Problem with strncpy (DJGPP in msdos window in win95) Date: Sat, 27 Sep 1997 16:22:31 -0400 Organization: The Computer Solution Lines: 74 Message-ID: <342D6B07.5BA9@ici.net> References: Reply-To: carla_JUNK_ AT ici DOT net NNTP-Posting-Host: d-ma-fallriver-23.ici.net Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Paul Fitzgibbons wrote: > > Hi there > > just like to say that I am enjoying learning with DJGPP and have also got > the Allegro Library from Shawn Hargreaves. > > I have a problem with the following code. When inputting strings of up to 20 > chars there doesnt appear to be a problem but if i input a string of length > 21 or greater the string then ends in funny characters. I thought strncpy > would have avoided this? I am able to write a function to check if the > length is greater and to loop if it is, but i would rather do it by > shortening the string. > > Any help will be much appreciated. > > Many thanks Paul Fitz > > [code follows] > > #include > #include > #include > > struct DETAIL > { > char name[21]; //max length +1 for NULL > }; > > void dispstru(struct DETAIL *ptr); > > main() > { > struct DETAIL Personal_info; > struct DETAIL *Personal_info_ptr; > char buff[1024]; //nice and long to avoid errors > > printf("What is the name? : "); > gets(buff); > > strncpy(Personal_info.name,buff,20); //copy 20 chars > > printf("name is : %s",Personal_info.name); > > Personal_info_ptr=&Personal_info; > dispstru(Personal_info_ptr); > } > > void dispstru(struct DETAIL *ptr) > { > printf("Pointer to name = : %s ",ptr->name); > } Your problem is when the length of the string to be copied is longer than 20 characters strncpy() does NOT place a terminator on the resulting string. You will have to do that yourself. This behavior is in accord with the ANSI/ISO Standard. BTW, If you use fgets() instead of gets() you can specify the length of the input. fgets(buffer, 21, stdin ); gets() is a really horrible function an should probably never be used. -- ************************************************ * Alicia Carla Longstreet carla AT ici DOT net * * Remove the _JUNK_ when replying to me. * ************************************************ My programming is Wobbly. It's good programming but it Wobbles, and the statements sometimes get in the wrong places. ************************************************ C appeals due to is simplicity and elegance.