Why does fflush(stdin) fail to work ?


Login or Register to Reply

 
Thread Tools Search this Thread
# 1  
Why does fflush(stdin) fail to work ?

Code:
   #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
        double number;
        while (scanf("%lf", &number) != 1)
        {   
            printf("Error\n");
           
        }   
        printf("%lf\n", number);
    
    
        return 0;
    }

Look at the above code.

I want the program to stop for me to type something again every time scanf gets an invalid value.


Never ending loop occurs.

I know the first invalid value has not been cleared and is still in the buffer.

So I use fflush(stdin).

Code:
    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
        double number;
        while (scanf("%lf", &number) != 1)
        {   
            printf("Error\n");
            fflush(stdin);
        }   
        printf("%lf\n", number);
    
    
        return 0;
    }


However, it keeps failing to work.

Why am I wrong and how can I modify the code to make that work?
# 2  
When an invalid character is entered the code goes into an endless loop. It seems this line:
Code:
while (scanf("%lf", &number) != 1)

Is essentially the same as this:
Code:
while(1)

It may check the condition, but in this case that condition will never change. You could that same check in an if statement so it is only checked once. Or use the while(1) in that loop with breaks to jump out of the loop when needed. You might want to look into fgets. The scanf function is great for learning, but can introduce potential security problems. Hope that helps.
# 3  
It is learnt that scanf will not consume any input if the first byte in input buffer itself does not match the format. So, when an invalid input is entered it will remain in input buffer until some one(getchar() ?) consume it.
# 4  
A call to fflush() flushes data held in an output stream buffer to the underlying file; it doesn't flush input streams. The return value from scanf() has told you that you don't have a floating point number at the start of the stream, but there is still unmatched data sitting in the buffer. If there wasn't any unmatched data, it would have reported EOF. Another call to scanf() with a different format might successfully match a hexadecimal input value, a character value, or a string value. If you replace the fflush(stdin); with another scanf() to skip over a string value (i.e. scanf("%*s");), you might get what you want... Or, you might not. You haven' t given a very clear description of what sort of input might be entered by your input source.

Note, however, that an EOF or an I/O error condition on the input stream will still leave you with an infinite loop. And, if you're dealing with humans typing input, you need to perform much better error handling.
Login or Register to Reply

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
Discussion at work, would a router work pluging a cable in wan1 and lan1?
broli
hi all. and sorry for the random question, but this sparkled a raging flame-war at work and i want more points of view situation a router, with linux of some sort, dhcp client requesting for ip in wan1 (as usual with wan ports) dhcp server listening in lan1, and assigning ip (as usual...... IP Networking
9
IP Networking
tr command fail to work in script
kavuri
Hi, I has the following command in the script. This command works fine if I execute on command prompt. If I run the script, this is not working as expected (deleting CR). tr -d "\015" < ${FilePath}/${FileName} > ${FilePath}/${File_Prefix}.csv I could not figure out whats...... Shell Programming and Scripting
6
Shell Programming and Scripting
How to write to stdin of another program (program A -> [stdin]program B)
vvaidyan
Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question: ---------...... UNIX for Dummies Questions & Answers
3
UNIX for Dummies Questions & Answers
How to write to stdin of another program (program A -> [stdin]program B)
vvaidyan
Hi, Program A: uses pipe() I am able to read the stdout of PROGAM B (stdout got through system() command) into PROGRAM A using: * child -> dup2(fd, STDOUT_FILENO); -> execl("/path/PROGRAM B", "PROGRAM B", NULL); * parent -> char line; -> read(fd, line, 100); Question: ---------...... Programming
1
Programming
Script doesn't work, but commands inside work
cheongww
Howdie everyone... I have a shell script RemoveFiles.sh Inside this file, it only has two commands as below: rm -f ../../reportToday/temp/* rm -f ../../report/* My problem is that when i execute this script, nothing happened. Files remained unremoved. I don't see any error message as it...... UNIX for Dummies Questions & Answers
2
UNIX for Dummies Questions & Answers

Featured Tech Videos