| | |
IO problem...
Please support our C advertiser: Programming Forums - DaniWeb Sister Site
Thread Solved |
hi, i have the following problem::
i want to read a string from the stdin. The string may contain white spaces so {i think} the scanf family of functions is out of the question... I think the most appropriate function for this case is fgets {if i am wrong please correct me}. Fgets is that it stops when it reads an enter in the input stream and problem arises when i use a menu prior to reading a string that causes an enter to be left in the stream... Is there anyway to circumvent this problem? The only way i found is if i call fgets 2 times in a row{so that the first will discart the enter , and the second will read the string}
here is a sample code::
thanks in advance for your help,
nicolas
PS:: also another weird behaviour is when instead of a number{in the menu response} i type a letter, then i get in an infinite loop.Why is this happening?
i want to read a string from the stdin. The string may contain white spaces so {i think} the scanf family of functions is out of the question... I think the most appropriate function for this case is fgets {if i am wrong please correct me}. Fgets is that it stops when it reads an enter in the input stream and problem arises when i use a menu prior to reading a string that causes an enter to be left in the stream... Is there anyway to circumvent this problem? The only way i found is if i call fgets 2 times in a row{so that the first will discart the enter , and the second will read the string}
here is a sample code::
c Syntax (Toggle Plain Text)
#include <stdio.h> int Menu() { int choice = 0; /* menu choice value */ /* with the following loop we force the user to choose * on of the 3 valid answers: 1, 2, or 3 */ do { fprintf(stdout, "Please choose one of the following:\n" "1. do1 \n" "2. do2 \n" "3. do3 \n"); fscanf(stdin, "%d", &choice); } while ( choice != 1 && choice != 2 && choice != 3); return choice; } int main() { int mychoice = Menu(); printf("\n\n\tyour choice was:: %d\n", mychoice); printf("\nnow lets read a string with fgets\n", mychoice); char buffer[256]; fgets(buffer, sizeof(buffer), stdin); fgets(buffer, sizeof(buffer), stdin); //fscanf(stdin, "%s", buffer); //unfortunatelly it doesn't work because it stops after reading a white space printf("\nhere is your string ::: %s\n", buffer); return 0; }
thanks in advance for your help,
nicolas
PS:: also another weird behaviour is when instead of a number{in the menu response} i type a letter, then i get in an infinite loop.Why is this happening?
Two roads diverged in a wood, and Iā I took the one less traveled by, and that has made all the difference.
by Robert Frost the "The Road Not Taken"
by Robert Frost the "The Road Not Taken"
Use fgets() for everything.
So for example.
This also fixes your "what if they type the wrong thing" problem as well.
So for example.
c Syntax (Toggle Plain Text)
int Menu() { char buff[BUFSIZ]; int choice = 0; /* menu choice value */ /* with the following loop we force the user to choose * on of the 3 valid answers: 1, 2, or 3 */ do { fprintf(stdout, "Please choose one of the following:\n" "1. do1 \n" "2. do2 \n" "3. do3 \n"); fgets( buff, sizeof buff, stdin ); if ( sscanf( buff, "%d", &choice ) != 1 ) { printf( "I asked for a number!\n" ); } } while ( choice != 1 && choice != 2 && choice != 3); return choice; }
This also fixes your "what if they type the wrong thing" problem as well.
thanks salem, it works! I understand why your code solves the problem "type the wrong thing"...
The thing i can't understand is why scanf can't work together with fgets...i think i 've read somewhere that it isn't the best thing to mix io functions from different families but i can't understand why...
The thing i can't understand is why scanf can't work together with fgets...i think i 've read somewhere that it isn't the best thing to mix io functions from different families but i can't understand why...
Two roads diverged in a wood, and Iā I took the one less traveled by, and that has made all the difference.
by Robert Frost the "The Road Not Taken"
by Robert Frost the "The Road Not Taken"
>>it isn't the best thing to mix io functions from different families
but scanf() and fgets() are of the same family of functions, all declared in stdio.h But it is NOT good to use scanf() for string input because it can (potentially) corrupt and possibly crash your program if you enter a string that is longer then the buffer size you want to hold it.
but scanf() and fgets() are of the same family of functions, all declared in stdio.h But it is NOT good to use scanf() for string input because it can (potentially) corrupt and possibly crash your program if you enter a string that is longer then the buffer size you want to hold it.
Last edited by Ancient Dragon; Nov 18th, 2007 at 1:59 pm.
Don't PM me with questions -- you might get a nasty PM in response. If you have a question then post it in one of the forums.
scanf() uses the bare minimum of characters necessary to perform the conversion, and leaves the first character which cannot be converted on the input stream.
So if you type in
42\n
and scan that with "%d", then 42 will be used and \n will be left.
Now you come along with fgets(), and boom, first character is \n, and it's "thank you and good night from fgets()".
So if you type in
42\n
and scan that with "%d", then 42 will be used and \n will be left.
Now you come along with fgets(), and boom, first character is \n, and it's "thank you and good night from fgets()".
If you are unsure about user input I would recommend reading the tutorial below:
http://www.daniweb.com/tutorials/tutorial45806.html
http://www.daniweb.com/tutorials/tutorial45806.html
*Voted best profile in the world*
i read the tutorials on input.Excellent work from Dave Sinkula.
It seems that my biggest mistake concerning fgets was that i didn't know this::
When the incoming text is one less than the size of the buffer, the newline is retained.
PS:: are there any simular tutorials for c++?{ i found the code snipset section but i don't know how can i search it...}
thanks again for all your help,
nicolas
It seems that my biggest mistake concerning fgets was that i didn't know this::
When the incoming text is one less than the size of the buffer, the newline is retained.
PS:: are there any simular tutorials for c++?{ i found the code snipset section but i don't know how can i search it...}
thanks again for all your help,
nicolas
Last edited by n.aggel; Nov 20th, 2007 at 8:56 am.
Two roads diverged in a wood, and Iā I took the one less traveled by, and that has made all the difference.
by Robert Frost the "The Road Not Taken"
by Robert Frost the "The Road Not Taken"
>PS:: are there any simular tutorials for c++
There is yes.
http://www.daniweb.com/tutorials/tutorial71858.html
And if you want to fall asleep the below is a must read:
http://www.daniweb.com/forums/thread90228.html
If you want to avoid all the theory you could read everything in as strings then convert to numbers wherever necessary.
There is yes.
http://www.daniweb.com/tutorials/tutorial71858.html
And if you want to fall asleep the below is a must read:

http://www.daniweb.com/forums/thread90228.html
If you want to avoid all the theory you could read everything in as strings then convert to numbers wherever necessary.
Last edited by iamthwee; Nov 20th, 2007 at 6:33 pm.
*Voted best profile in the world*
![]() |
Similar Threads
- Problem with Windows Update and WinXP (Web Browsers)
- Installing Windows 98 On VMware. Floppy problem (Windows 95 / 98 / Me)
- Windows XP keeps restarting since a new video card (Windows NT / 2000 / XP)
- Redhat Linux 6.2 - ipop3d problem? (*nix Software)
- Problem with T720 (Cellphones, PDAs and Handheld Devices)
- Connection Problems (Networking Hardware Configuration)
- Encoding (Unicode) problem in IE 6.0 (Web Browsers)
- .htaccess mod_rewrite problem (Linux Servers and Apache)
- Javascript/HTML problem!!! (JavaScript / DHTML / AJAX)
Other Threads in the C Forum
- Previous Thread: Terminating a String
- Next Thread: c for dos
| Thread Tools | Search this Thread |
* ansi api append array arrays bash binarysearch calculate centimeter changingto char character convert copyanyfile copypdffile creafecopyofanytypeoffileinc createcopyoffile createprocess() dynamic execv fflush file floatingpointvalidation fork forloop frequency function getlogicaldrivestrin givemetehcodez grade graphics gtkwinlinux histogram homework i/o ide inches include infiniteloop initialization input intmain() iso keyboard km license linked linkedlist linux list looping loopinsideloop. lowest matrix microsoft multi mysql oddnumber open opendocumentformat openwebfoundation overwrite pdf pointer pointers posix power program programming pyramidusingturboccodes radix read recursion recv recvblocked reversing scanf scheduling segmentationfault send shape single socketprogramming stack standard strchr string strings suggestions test testautomation threads unix urboc user variable whythiscodecausesegmentationfault win32api windowsapi






