• C

First chance exception and string concatenation: two related questions

Hello.

Please look at the following code, intended to read 10 chars from a file and then append it to a char array.  The end result is that the multiple calls to fgets should be represented as array y:

char y[30];
memset(y, ' ', 30);

FILE* ifp = fopen("input.txt", "r");

char sz[10];

while (strlen(y) != 30 && (!feof(ifp)) ) {
      fgets(sz, 10, ifp);
      strcat(y, sz);
}

fputs(y, stdout);

The input file is

line 1
line 2
line 3
line 4
line 5
line 6

and the output I get is

                              @line 1
line 2
line 3
line 4
line 5
line 6
line 6

So,

1) Why do I have the rubbish at the start of line 1 of the output ?
2) I get a first chance exception when run in debug mode *when the input file has one blank line at the end*.  This does not happen in release mode, and does not happen at all without the final blank line.  The code crashes at

if ( wchar > 255 )  /* validate high byte */

(XWCTOMB.c, line 116).

Any ideas ?  I know that in general first chance exceptions can be ignored, but just wondered why this is happening.

(25 points per question here)

TIA !
LVL 19
mrwad99Asked:
Who is Participating?
 
Kent OlsenData Warehouse Architect / DBACommented:
Hi mrwad99,

1a)  You initialize y[] with spaces.  You should initilize the first charter to 0 ('\0').
1b)  Define y[] as y[40] and test for strlen(y) <= 30.  You're reading 6 characters (plus end-of-string, plus possibly carriage-return) into a 10 character array.  You might not fill the array exactly full.  Plus, even if you do put exactly 30 characters into the array, you're writing 31-characters to terminate the string and overflowing the array.

2)  The program is using ASCII characters.  Why are you testing for wide characters?


Good Luck!
Kent
0
 
mrwad99Author Commented:
1) Right thanks Kent, it was the issue with initialising y to hold ' ' not '\0' that was causing the problem.
2) I am not testing for any type of character; the code I posted in the original question is all the code I have (less main() and a few #includes).  The line the code crashes on is in XWCTOMB.c, line 116: I found this out by running the debugger.  Anyway that is redundant now because with the new changes that does not happen.

So what I think y will look like is:

line 1\0line 2\0line 3\0line 4\0line5\0line 6\0

Or would it look like

line 1line2line 3line 4line 5line 6\0

After reading all the file in (with an appropriately sized char[])

TIA !
0
 
ankuratvbCommented:
The output would be:

line 1line2line 3line 4line 5line 6\0
0
WEBINAR: 10 Easy Ways to Lose a Password

Join us on June 27th at 8 am PDT to learn about the methods that hackers use to lift real, working credentials from even the most security-savvy employees. We'll cover the importance of multi-factor authentication and how these solutions can better protect your business!

 
mrwad99Author Commented:
And I take it that is because when using strcat(), the first character of the string to be concatenated is placed over any preceeding '\0' ??
0
 
ankuratvbCommented:
Yes.
And '\0' is placed at the end of the concatenated string.
0
 
mrwad99Author Commented:
Points split in favour of Kdo since he answered the primary questions; ankuratvb you get 20 of the 50 since you sorted my last query.

Thanks a lot both !
0
 
ankuratvbCommented:
BTW,strcat() searches for the first '\0' and concatenates the second string from here.

Try this:

#include <string.h>
#include <stdio.h>

int main(void)
{
   char destination[25]="a\0b";
   char *blank = " ", *c = "C++", *turbo = "Turbo";

   strcat(destination, turbo);

   printf("%s\n", destination);
   return 0;
}

The result is "aTurbo".
0
 
mrwad99Author Commented:
Yep; thanks for solidifying that ankuratvb !  Greatly appreciated.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.