Calling scanf() after another string input function creates phantom input

前端 未结 3 807
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-25 11:00

Here\'s a small program:

#include 

int main() {
  char str[21], choice[21]; int size;
  while(1){
    printf(\"$ \");
    fgets(str, 20, stdin);
         


        
相关标签:
3条回答
  • 2021-01-25 11:34

    Use a 'char' of a specific size char choice [1]

    OR

    char c[1];
    c = getchar();
    if(c[0] == 'y' || c[1] == 'y'){
     // DO SOMETHING
    }
    
    0 讨论(0)
  • 2021-01-25 11:45

    As described in other answer scanf call leaves the newline in the input buffer you can also use getchar() after scanf like this :

    scanf("%20s", choice);// always remember( & good) to include field width 
                          // in scanf while reading
    

    Strings otherwise it will overwrite buffer in case of large strings `

    getchar();  //this will eat up the newline 
    

    Besides , you should also use fgets like this :

    fgets(str,sizeof str, stdin); //Its better 
    
    0 讨论(0)
  • 2021-01-25 11:49

    It because the scanf call reads a character, but leaves the newline in the buffer. So when you next time call fgets is finds that one newline character and reads it resulting in an empty line being read.

    The solution is deceptively simple: Put a space after the format in the scanf call:

    scanf("%s ", choice);
    /*       ^    */
    /*       |    */
    /* Note space */
    

    This will cause scanf to read and discard all training whitespace, including newlines.

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