我正在使用c中的双向链表制作树。 我在该函数中使用递归调用,但不知何故它不起作用。 我的代码是:
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;
}
这里在下面的函数中我遇到了问题。
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;
}
代码编译正确,但问题是,代码不等待我的选择(我使用scanf()
,C应该等待,直到我输入到终端的输入。)
但输出是:
enter the value to the node4
is there any left child??
is there any right child??
请协助。
答案 0 :(得分:4)
scanf("%d", &value)
留下了换行符; scanf("%c", &choice1)
读取该换行符。
每次都检查scanf()
的返回值。并打印您阅读的内容以帮助您调试代码。确保你的程序符合你的想法。
一个简单的解决方法是将第二个scanf()
替换为scanf(" %c", &choice1)
。格式字符串中的空白占用空白区域(包括换行符),并读取第一个非空白字符。当然,它也留下了一条新线。
正如评论中所暗示的那样,控制事物通常更容易:
char line[4096];
if (fgets(line, sizeof(line), stdin) == 0)
...deal with EOF...
然后您可以使用sscanf()
来解析该行。这种通用技术比直接使用scanf()
更容易出错;如果要将整行包含在错误报告中,那么一致地报告错误也会容易得多。当您在每次调用scanf()
时阅读多次转化时,这一点更为重要。
答案 1 :(得分:0)
问题是,\r
被发送到第二个scanf,保留在第一个scanf中。
由于你只读了一个带有scanf的字符(BTW没有推荐 - 改为使用getchar()
),它接受回车(\r
)。
如果您仍想使用第二个scanf,请在第一个scanf()之后立即刷新标准输入:fflush(stdin)
。
答案 2 :(得分:0)
scanf()
没有任何问题,学习使用它是阅读文档的一个很好的练习,但它确实有效。学习使用它是程序员的一个很好的样本!
首先,请在代码中尝试以下语句:
char &choice1[2]; // allow for %c\0, but even this can be avoided
// etc.
scanf("%1s", &choice1);
if (tolower(choic1[0]) == 'y') { // etc.
%1s
读取并丢弃空格,包括新行,1限制符合字符串的字符数。
如果此更改不起作用,请告诉我,我将测试/使用您的代码来查找修复。