C - trying to read a single char from stdin (and failing) w/ scanf / getchar

后端 未结 4 735
无人共我
无人共我 2020-11-30 12:53

as a part of a homework assignment, I\'m trying to read a single char from stdin, and act according to it:

char choice;

while (1) {
    printf(\"please ente         


        
相关标签:
4条回答
  • 2020-11-30 13:37

    fflush() is not defined by ISO for input streams. It is defined in Microsoft's C runtime library, but is not portable.

    While the "space before %c" solution may work when the user enters the expected data, it will fail in many ways; try entering "y n y n" for example. Console input is lin-oriented; your best bet is to ensure that you discard the entire line thus:

    scanf( "%c", choice ) ;
    while( choice != '\n' && getchar() != '\n' ) /* do nothing*/ ;
    
    0 讨论(0)
  • 2020-11-30 13:41

    You need a space between scanf(" and the %c for it to work correctly:

    scanf(" %c", &choice);
    

    And you also need to use &choice, not choice!

    EDIT: While you're at it, you might want to look into do while() for that loop (unless the professor specifically said to use a break) - do while works great when validating user input!

    0 讨论(0)
  • 2020-11-30 13:41

    First of all I will keep it brief.Because of insufficient points to submit a comment If we can see that number of o/p is (one + the no of charcter) This is beacuse when we hit enter after entering the characters '\n' which is non-printable character also gets added after your string.

    $ ./run
    please enter [y]es, [n]o or [m]aybe: y<return>
    you selected yes!
    Please enter only 'y', 'n' or 'm'!  -----------> it is due to reading of the '\n' by scanf
    

    EDITED Due to insufficient points I could post this as a comment.This is a workaround of the above answers

    0 讨论(0)
  • 2020-11-30 13:50

    Better still, use fgetc(). scanf() should always be a last resort.

    0 讨论(0)
提交回复
热议问题