This question already has an answer here:
-
scanf won't ask for input the second time [duplicate]
5 answers
I am working on making tree using doubly linked list in c.
I use recursive call in that function , but somehow it do not works.
my code is :
struct node
{
int data;
struct node *right;
struct node *left;
};
struct node* getNode()
{
struct node *temp;
temp= (struct node *)malloc(sizeof(struct node));
temp->right=NULL;
temp->left=NULL;
return temp;
}
here in the below function I am getting the problem.
struct node* maketree()
{
struct node *t;
t=getNode();
int value;
char choice1='n',choice2='n';
printf("\nenter the value to the node");
scanf("%d",&value);
t->data=value;
printf("\nis there any left child??\n");
scanf("%c",&choice1); // I think here my problem is .
if (choice1 == 'y')
{
t->left=maketree();
}
printf("\nis there any right child??\n");
scanf("%c",&choice2);
if (choice2 == 'y' || choice2 == 'Y')
{
t->right=maketree();
}
return t;
}
int main (void)
{
struct node *t;
t=maketree();
return;
}
the code compiles properly , but the problem is , the code do not wait for my choice (I use scanf()
, C should wait untill I enter the input to the terminal.)
but the output is :
enter the value to the node4
is there any left child??
is there any right child??
please assist.
The scanf("%d", &value)
left a newline behind; the scanf("%c", &choice1)
reads that newline.
Check the return values from scanf()
every time. And print what you read to help you debug your code. Make sure your program got what you think it got.
A simple fix is to replace the second scanf()
with scanf(" %c", &choice1)
. The blank in the format string eats up white space, including newlines, and reads the first non-blank character. Of course, it too leaves a newline behind.
As intimated in the comments, it is usually easier to control things with:
char line[4096];
if (fgets(line, sizeof(line), stdin) == 0)
...deal with EOF...
And then you can use sscanf()
to parse the line. This general technique is quite a bit less error prone than using scanf()
directly; it is also a lot easier to report errors coherently when you have the whole line to include in the error report. That matters more when you're reading multiple conversions per call to scanf()
.
The problem is, the \r
is sent to the second scanf, remaining from the first scanf.
And since you're reading only one char with scanf (which is BTW not recomended - use getchar()
instead) it accepts the carriage return (\r
).
If you still want to use the second scanf, make a flush of the standard input: fflush(stdin)
right after the first scanf().
There is nothing wrong with scanf()
, learning to use it is a good exercise in reading documentation, but it DOES work. Learning to use it is a good sample of what programmers do!
As a first guess, try these statements in your code:
char &choice1[2]; // allow for %c\0, but even this can be avoided
// etc.
scanf("%1s", &choice1);
if (tolower(choic1[0]) == 'y') { // etc.
The %1s
reads and discards white space, including new lines, and the 1 limits the number of chars that qualify as a string.
If this change does NOT work, let me know, and I will test/use your code to find a fix.