fgets() not waiting for input

后端 未结 3 1861
北海茫月
北海茫月 2020-12-11 23:49

I wrote the following code:

int N;
scanf(\"%d\", &N);
int i;
for (i = 0; i < N; i++) {
  char line[LINE_MAX];
  if (fgets(line, LINE_MAX, stdin) != NU         


        
相关标签:
3条回答
  • 2020-12-12 00:10

    As geekosaur said, you are not handling the newline left behind by scanf. You can modify your scanf format string to take it into account:

    scanf("%d *[^\n]", &N);
    

    *[^\n] says to ignore everything after your integer input that isn't a newline, but don't do anything with the newline (skip it).

    Test program output:

    emulawsk@cs:~/testing$ ./test2
    3
    13
    1 - 3
    26
    2 - 6
    59
    5 - 9
    
    0 讨论(0)
  • 2020-12-12 00:19

    It has nothing to do with threading. scanf() reads exactly what you ask it to; it's leaving everything else unread, notably the newline following the data. (You also aren't dealing with the possibility that the user didn't type what you intended.)

    If you want to do line oriented input, use fgets(). Don't use scanf() and hope the system can magically intuit that you want to ignore what you didn't read.

    0 讨论(0)
  • 2020-12-12 00:29

    You can place a call to fflush() just after the scanf() like this:

    int N;
    scanf("%d", &N);
    fflush (stdin);
    int i;
    ... (rest of code)...
    

    So the newline character ges erased from the stdin buffer and the next fgets() will stop to ask for input.

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