Question

I'm new to c programming and I'm facing this problem with my program
I have a loop that gets a char form the input buffer

while(c = getchar()){
    if(c == '\n') break;
    if(c == '1') Add();
    if(c == '2') getInput(); // this is where the headache starts
    ....
}

here is the getInput() function

void getInput()
{ 
    char ch = getchar();
    if(ch == '1') doSomething();
    ....
}

but when calling getchar() from the getInput() function it only gets characters that were left in the input buffer from the last call of getchar(). and what i want it to do is to get newly typed characters.

I've been googling for two hours for a decent way to clear the input buffer but nothing helped. So a link to a tutorial or an article or something is very appreciated and if there's another way to implement this then please tell me.

Was it helpful?

Solution

First of all there will be == comparison operator rather than = assignment operator in the if condition in this code.

while(c = getchar()){
    if(c = '\n') break;
    if(c = '1') Add();
    if(c = '2') getInput(); // this is where the headache starts
    ....
}

And for stop taking input try EOF which from keyboard can be given by prssing CTRL+D.

EDIT : The problem is with the \n which is actually taken as input when you press ENTER key on the key board. So change just one line of code.

if (c ==\n) break; to if (c == EOF ) break; and as I said EOF is the end of input.

Then your code will work fine.

Flow of code :

step 1: suppose `2` is input 
step 2: getInput() is called
step 3: suppose `1` as input  // in getInput
step 4: doSomething() is called  // from getInput
step 5: After completion of doSomething again come back to while loop , 

but in your case you have already given `\n` character as an input 

when you pressed `1` and `ENTER`.And thus loop terminates.

but after changing the code as I said , this should work.

NOTE: To understand code flow and for debugging purposes it's best practice to put printf() in various places in functions and see the output as which lines are executing and which are not.

OTHER TIPS

This should work: (Example of clearing input buffer)

#include <stdio.h> 

int main(void)
{
  int   ch;
  char  buf[BUFSIZ];

  puts("Flushing input");

  while ((ch = getchar()) != '\n' && ch != EOF);

  printf ("Enter some text: ");

  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }

  return 0;
}

/*
 * Program output:
 *
 Flushing input
 blah blah blah blah
 Enter some text: hello there
 You entered: hello there
 *
 */
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top