printf a string is adding characters !?!

Started by jakeb211, January 30, 2010, 09:36:26 PM

Previous topic - Next topic

jakeb211

Hello,  I am having a little bit of a problem.  I posted a question a little while ago about passing strings back from functions, and found this forum very hospitable to a newbie, so i'm back with another question.

My function to request the user's information is:

void edt_usr_init(char *finit, char *minit, char *linit)
{   
   /* Clear the screen */
   system ("cls");

      /* Prompt for and recieve user initials */
      printf ("Enter User's initials (xxx) >>\n");
      scanf (" %c%c%c", finit, minit, linit);

}


My function to write to a file, for practice purposes, is:
(I'm using this to check the values that will eventually all be contained is strings, but these results weren't expected. A call to printf first made me aware of it.)

void usr_info(void)
{   
   char   ini[3];
   int    kg;
   FILE   *outp;   /* pointer to output file */

      outp = fopen("practice/usr_stat.txt", "a"); /* open the output file to append it */
      
      edt_usr_init(&ini[0], &ini[1], &ini[2]);   /* get the user's info */
      edt_usr_wght(&kg);                         /* get the user's weight */

      fprintf(outp, "\n%s\n%d", ini, kg);      /* print output to file */

      fclose(outp);                                  /* close the output file */
      
}

for an input of "jab" for usr_init fuction and "104" for usr_wght, my text file ends up reading...

jab€ÿ
104

I don't quite get it.  If I make the string longer assuming that "\0" will be placed at the end of data input, which is what i thought i was doing by making the string length [3], it just changes the funny characters after my user input.

If anyone has any thoughts, I'd be grateful. Thank you.

Bitbeisser

You are reading in three single characters but use printf to print a sting, which has to be terminated by a 0x00 character. But you are not providing such a 'zero termination', hence printf when pointed to a string, just keeps printing characters until it 'accidently' encounters a zero byte...
Simplest workaround is to expand ini to contain 4 characters (ini[4]) and initialize ini [3] fixed with 0x00...

Ralf

AlexN

.. or you can change the printf-function:
fprintf(outp, "\n%c%c%c\n%d", ini[0], ini[1], ini[2], kg);      /* print output to file */

.. but I would prefer the solution of Ralf.  ;)
best regards
Alex ;)

jakeb211

Thank you for the responses, I actually just realized that and was coming back here to post the answer.  You were exactly right there was no '\0' at the end of the chars.  Thanks again!