Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Debug Assertion Failure on gets(char) function

Reply
Thread Tools

Debug Assertion Failure on gets(char) function

 
 
kudruu@gmail.com
Guest
Posts: n/a
 
      06-18-2007
Hello,
I am having a problem in Microsoft Visual C++ with some code I have
written (I am a bit of a novice so I appologize if this is a very
mundane problem).
This is a segment from one of the functions I am using. I am trying
to get a user to input whether they want an output file or not and if
they do to specify the name. Output_File is a global char.
Maybe there is a better way to do this, nonetheless, it compiles with
a LNK4075 warning.
When I run the code, however, it allows me to enter the if statement
and type my preference. Then it doesn't even advance to the next
print statement (in or outside of the if), it quits with the message:

Code:
Debug Assertion Failed!
File: fopen.c
Line: 55

Expression: *file != _T("\0')
Here is the problem code:
char Yes_No[1];

printf("Do you wish to write an output file (y/n)? ");
if (gets(Yes_No) == "y"){
printf("\nPlease input the desired name of your file: ");
scanf("%s",&Output_File);
}

 
Reply With Quote
 
 
 
 
kudruu@gmail.com
Guest
Posts: n/a
 
      06-18-2007
On Jun 18, 9:42 am, (E-Mail Removed) wrote:
>
Code:
> Debug Assertion Failed!
> File: fopen.c
> Line: 55
>
> Expression: *file != _T("\0')
>
>
> Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){
> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);
> }


So I did a little bit of tweaking and now it reads:
printf("Do you wish to write an output file (y/n)? ");
scanf("%s",&Yes_No);
printf("Got Here\n");
if (Yes_No[0] == 'y'){
printf("\nPlease input the desired name of your file: ");
scanf("%s",&Output_File);
}

This works only for the case of y, however I still get the error on n
(and any other letter). After this function, there are several other
functions that must be called using Output_File, is it possible to set
a character array to Null or False?

 
Reply With Quote
 
 
 
 
kudruu@gmail.com
Guest
Posts: n/a
 
      06-18-2007
On Jun 18, 9:42 am, (E-Mail Removed) wrote:
>
Code:
> Debug Assertion Failed!
> File: fopen.c
> Line: 55
>
> Expression: *file != _T("\0')
>
>
> Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){
> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);
> }


So I did a little bit of tweaking and now it reads:
printf("Do you wish to write an output file (y/n)? ");
scanf("%s",&Yes_No);
printf("Got Here\n");
if (Yes_No[0] == 'y'){
printf("\nPlease input the desired name of your file:
");
scanf("%s",&Output_File);
}

This works only for the case of y, however I still get the error on n
(and any other letter).

Putting an else statement in that reads:
else
ACS_Output_File = NULL;
Only produces an error that my left operand must be an l-value (type
mismatch). I thought the syntax
else
ACS_Output_File[] = NULL;
would work but it gives me a bracket error.

After this function, there are several other
functions that must be called using Output_File, is it possible to
set
a character array to Null or False?

 
Reply With Quote
 
Richard Tobin
Guest
Posts: n/a
 
      06-18-2007
In article <(E-Mail Removed)>,
Richard Heathfield <(E-Mail Removed)> wrote:

>Never compare strings with ==.


Hardly ever.

It is sometimes useful to "intern" strings, that is, ensure that there
is always only one string with a given value in a given set. The main
reason for doing this is exactly so that you can compare them with ==.

I once had a program that went usefully faster after "strcmp(a,b) == 0"
was replaced with "a == b || strcmp(a, b) == 0", because there was a very
high chance that equal strings would have come from the same source and
thus be equal as pointers.

-- Richard
--
"Consideration shall be given to the need for as many as 32 characters
in some alphabets" - X3.4, 1963.
 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      06-18-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) said:

<snip>

> Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){
> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);
> }


Never use gets. Never use %s in scanf. Never compare strings with ==.
Never use a single-character array to store a non-empty string.

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

int chomp(char *s)
{
char *p = strchr(s, '\n');
if(p != NULL)
{
*p = '\0';
}
return p != NULL;
}

int main(void)
{
char Yes_No[16] = {0};
char Filename[FILENAME_MAX] = {0};

printf("Do you wish to write an output file (y/n"? ");
fflush(stdout);
if(fgets(Yes_No, sizeof Yes_No, stdin) != NULL)
{
printf("Please input the desired name of your file: ");
fflush(stdout);
if(fgets(Filename, sizeof Filename, stdin) != NULL)
{
if(chomp(Filename))
{
/* Now:
open your file
if it opened okay
write stuff
check that it wrote okay
close it
*/
}
else
{
fprintf(stderr, "Filename too long.\n");
}
}
else
{
fprintf(stderr, "Couldn't read filename.\n");
}
}
else
{
fprintf(stderr, "Couldn't read your answer.\n");
}
return 0;
}

--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at the above domain, - www.
 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      06-18-2007
(E-Mail Removed) wrote On 06/18/07 11:42,:
> Hello,
> I am having a problem in Microsoft Visual C++ with some code I have
> written (I am a bit of a novice so I appologize if this is a very
> mundane problem).
> This is a segment from one of the functions I am using. I am trying
> to get a user to input whether they want an output file or not and if
> they do to specify the name. Output_File is a global char.
> Maybe there is a better way to do this, nonetheless, it compiles with
> a LNK4075 warning.
> When I run the code, however, it allows me to enter the if statement
> and type my preference. Then it doesn't even advance to the next
> print statement (in or outside of the if), it quits with the message:
>
>
Code:
> Debug Assertion Failed!
> File: fopen.c
> Line: 55
> 
> Expression: *file != _T("\0')
>
>
> Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){
> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);
> }
>


Your code contains at least five errors, possibly
more having to do with the portions you haven't shown.

1: NEVER USE gets()! NEVER, NEVER, NEVER!!! For
some of the reasons, see Question 12.23 in the
comp.lang.c Frequently Asked Questions (FAQ) at
http://www.c-faq.com/. (This is probably the
cause of your linker warning.)

2: A string with N "payload" characters requires
space for N+1 characters altogether, because a
zero byte '\0' follows the last payload character.
Your Yes_No array is one character long, so it
has enough room for N==0 payload characters.

3: The == operator is not the way to compare strings
for equality of their payloads. See Question 8.2
in the FAQ.

4: The way you are using scanf() is vulnerable to the
same problem as the NEVER-to-be-used gets(). See
Question 12.20 in the FAQ.

5: If Output_File is as you say a char, then it is
too small to hold a file name; see error #2. If
it is an array of char, the & operator shouldn't
be there; see Question 6.12 in the FAQ. And if
it's a char* pointer, the & operator still doesn't
belong; see the entire Section 6 of the FAQ. One
way or another, your use of Output_File is wrong.

You say you're a novice, and there's nothing shameful
about that: Comparatively few people pop out of the womb
already knowing C. But it seems to me that you are not
just "a bit of a novice" but a "rank beginner," and you
need to spend a good deal more time with a C textbook
before you go much further. Your misunderstandings are
so fundamental at the moment that Usenet is a poor vehicle
for correcting them. It's a good medium for communicating
fine points, for airing opinions, and for invective and
flame wars, but it's not a channel that's suited to mass
transfer of basic information. Hit the books!

--
(E-Mail Removed)
 
Reply With Quote
 
Richard Heathfield
Guest
Posts: n/a
 
      06-18-2007
Typo corrections. See below.

Richard Heathfield said:

> (E-Mail Removed) said:
>
> <snip>
>
>> Here is the problem code:
>> char Yes_No[1];
>>
>> printf("Do you wish to write an output file (y/n)? ");
>> if (gets(Yes_No) == "y"){
>> printf("\nPlease input the desired name of your file: ");
>> scanf("%s",&Output_File);
>> }

>
> Never use gets. Never use %s in scanf. Never compare strings with ==.
> Never use a single-character array to store a non-empty string.
>
> #include <stdio.h>
> #include <string.h>
>
> int chomp(char *s)
> {
> char *p = strchr(s, '\n');
> if(p != NULL)
> {
> *p = '\0';
> }
> return p != NULL;
> }
>
> int main(void)
> {
> char Yes_No[16] = {0};
> char Filename[FILENAME_MAX] = {0};
>
> printf("Do you wish to write an output file (y/n"? ");


Spurious " there. Should read:

printf("Do you wish to write an output file (y/n)? ");

> fflush(stdout);
> if(fgets(Yes_No, sizeof Yes_No, stdin) != NULL)


Sheesh. I forgot to check that the answer was yes.

Replace that line with:

if(fgets(Yes_No, sizeof Yes_No, stdin) != NULL && Yes_No[0] == 'y')

> {
> printf("Please input the desired name of your file: ");
> fflush(stdout);
> if(fgets(Filename, sizeof Filename, stdin) != NULL)
> {
> if(chomp(Filename))
> {
> /* Now:
> open your file
> if it opened okay
> write stuff
> check that it wrote okay
> close it
> */
> }
> else
> {
> fprintf(stderr, "Filename too long.\n");
> }
> }
> else
> {
> fprintf(stderr, "Couldn't read filename.\n");
> }
> }
> else
> {
> fprintf(stderr, "Couldn't read your answer.\n");
> }
> return 0;
> }
>


--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at the above domain, - www.
 
Reply With Quote
 
Kenneth Brody
Guest
Posts: n/a
 
      06-18-2007
(E-Mail Removed) wrote:
>
> Hello,
> I am having a problem in Microsoft Visual C++ with some code I have

[...]
>
Code:
> Debug Assertion Failed!
> File: fopen.c
> Line: 55
> 
> Expression: *file != _T("\0')
>


You would have to ask in a Microsoft-specific group about the
exact meaning of that asssertion error.

[OT response, using magical knowledge]

The error means _tfsopen() was passed a filename of "".

> Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){
> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);
> }


I find it unlikely that this is the code where the failure takes
place, given that I don't see any file opens here, though it is
possible. (That's where an MS-specific group comes in handy.)

However, getting back to non-platform-specific things, what happens
if the user enters more than zero characters at the "gets(Yes_No)"
call, given the definition of "char Yes_No[1]"?

--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------+
Don't e-mail me at: <(E-Mail Removed)>

 
Reply With Quote
 
kudruu@gmail.com
Guest
Posts: n/a
 
      06-18-2007
Thank you very much for your input. I changed the compare convention
to use string compare as the extra clock cycles will not matter in
this instance. However, I found that my problem actually stemmed from
passing a global variable around do different functions. Instead, I
set a file write variable as a boolean and passed it around to my
functions. The file string name is then used in two separate
functions.
Sorry for not specifying my file string name to begin with, it was an
array of 80 characters (long enough for a file name). The part of the
code that contains the scanf functions is part of a function
containing a case statement where I listen for event messages over a
com port and must write each separate one to a file (previously I had
not put in a file write option).
Apologies all around to the C community for using gets.
Thanks for all the help!

 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      06-18-2007
On Mon, 18 Jun 2007 08:42:42 -0700, (E-Mail Removed) wrote:

>Hello,
>I am having a problem in Microsoft Visual C++ with some code I have
>written (I am a bit of a novice so I appologize if this is a very
>mundane problem).
>This is a segment from one of the functions I am using. I am trying
>to get a user to input whether they want an output file or not and if
>they do to specify the name. Output_File is a global char.
>Maybe there is a better way to do this, nonetheless, it compiles with
>a LNK4075 warning.
>When I run the code, however, it allows me to enter the if statement
>and type my preference. Then it doesn't even advance to the next
>print statement (in or outside of the if), it quits with the message:
>
>
Code:
>Debug Assertion Failed!
>File: fopen.c
>Line: 55
>
>Expression: *file != _T("\0')
>
>
>Here is the problem code:
> char Yes_No[1];
>
> printf("Do you wish to write an output file (y/n)? ");
> if (gets(Yes_No) == "y"){


At this point, your code invokes undefined behavior. Unless the user
does nothing but press the enter key, the input will involve at least
two characters. Your array has room for only one. You overflow your
buffer. Your solution to this problem should involve using a function
other than gets.

After you solve that problem, look in your reference book for how to
compare strings. The == operator is not what you want.

> printf("\nPlease input the desired name of your file: ");
> scanf("%s",&Output_File);


You didn't show the definition of Output_File but 99+% of the time
this is wrong. What type of argument must the %s conversion
correspond to? What type is your argument?

> }



Remove del for email
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Debug Assertion Failure? Gone With Wind C++ 3 05-25-2008 10:57 AM
Assertion failure on hotshot.stats.load() Yang Python 1 10-27-2006 08:32 AM
gc assertion failure Todd Miller Python 3 10-30-2003 10:44 AM
RE: gc assertion failure Tim Peters Python 3 10-29-2003 10:27 PM
Debug assertion failure Kostatus C++ 1 08-03-2003 04:53 AM



Advertisments