• 0

what is the difference between these two programs?


Question

What is the difference between these two programs. I read in a book that the first method is better but isn't there larger use of memory?

First

#include<stdio.h>
#include<string.h>
int main()
{
	char line[100];
	int value;
	printf("Enter the Number to be doubled : ");

	fgets(line,sizeof(line),stdin);
	sscanf(line, "%d", &value);

	printf("The double of the number is %d \n",2*value);
	return(0);
}

Second

#include<stdio.h>
#include<string.h>
int main()
{
int value;
printf("Enter the value\n");
scanf("%d",&value);
printf("The double of the number is %d",2*value);
}

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Some people seem to think that fgets is inherently safer, personally I have strong doubts about it. In any case the first program also uses scanf and does no validation on the input before calling scanf; it doesn't validate that fgets nor scanf succeeded, so it's just as terribly error-prone as the second one. And, as you mention, the first one also uses 100 extra bytes on the stack for nothing.

I suppose the point of using fgets before scanf is to do some kind of validation... which doesn't happen here.

Edited by Dr_Asik
Link to comment
Share on other sites

  • 0

Neither is a good example. In the first you're allocating 100 bytes on the stack for a integer value which is probably a maximum of 4 bytes. And the second example you're at the mercy of the user as you're hoping they enter a valid integer.

As far as I'm aware fgets() is used to ensure you don't retrieve more bytes than you can store in a buffer. This provides some validation but in no way shape or form ensures the user has entered a valid value.

Link to comment
Share on other sites

  • 0

ok.. let's assume that we used 4 bytes in line char..

so now is it better than the second one..?

in the first program we two functions to get the input whereas in the second one we only use one function for storing the input.. isnt it better now?

plus what is the difference between scanf and sscanf??

Link to comment
Share on other sites

  • 0

As I said, both programs are very error-prone because both scanf and fgets can fail and neither checks for that. If you need safe input, it's pretty complicated in C... IMO any input in a C program should be debugging purposes, if you need reliable, end-user input, use a better programming language like Java, Python, C# or whatever. (or take the time to learn it properly in C : http://www.friedspace.com/cprogramming/safeinput.php more nice advice at http://www.daniweb.com/tutorials/tutorial45806.html#)

I suggest you read the description of these functions here:

fgets

scanf

sscanf

It's when you have to deal with this stuff that you realize how pathetic C is for general application programming; it's a thin, thin layer over assembly, nothing else, you're still coding tons of error-prone, complicated logic for the most basic tasks. Anyway I disgress.

Edited by Dr_Asik
Link to comment
Share on other sites

  • 0
I read in a book that the first method is better

Well, what reason does the book give?

Neither is a good example. In the first you're allocating 100 bytes on the stack for a integer value which is probably a maximum of 4 bytes.

He's allocating 100 bytes for a string representation of a character, which could easily exceed 4 bytes. 4 bytes is if the integer is stored as an integer, and for that, he is already allocating exactly 4 bytes on the stack.

Not that 100 bytes on the stack means that much. Yes, it's a bit more memory, but this is the stack, not the heap, and the stack is pre-reserved and often pre-committed at the start of your thread (this could vary by OS, of course), so unless this pushes you past the range of committed pages on the stack, it doesn't matter one bit if you allocate 1 byte or 1000 bytes.

plus what is the difference between scanf and sscanf??

Read the documentation.

Although the specifics vary from implementation to implementation, generally speaking, sscanf is implemented using scanf or vice-versa. In the Windows CRT, for example, sscanf just creates a dummy stream from the string and passes all that along to scanf. For the book to say that fgets+sscanf is somehow inherently better than scanf suggests ignorance on the part of the book's author. Unless you have a specific need to work with the string--perhaps to do additional custom processing or checking before running the scanf--there is no point in doing what the author is suggesting. In either case, you'll need to do input checking--you can't escape that.

Link to comment
Share on other sites

  • 0
It's when you have to deal with this stuff that you realize how pathetic C is for general application programming

:p Not that a lot of general application programming these days operate on console input...

Edit: Okay, I see his thread about doing network in C. Oh, that oughta be fun...

Link to comment
Share on other sites

  • 0
:p Not that a lot of general application programming these days operate on console input...
Oh yeah, GUI programming in C is tha shiznit. :laugh:
Link to comment
Share on other sites

  • 0
Oh yeah, GUI programming in C is tha shiznit. :laugh:

Actually, Win32 with C isn't that bad. :p It's a fairly straightforward translation to go from the Windows message model to the typical OO model for GUIs and vice-versa.

Link to comment
Share on other sites

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.