-1

我正在使用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??

请协助。

4

3 回答 3

7

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().

于 2013-08-22T05:44:52.170 回答
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 限制了符合字符串条件的字符数。

如果此更改不起作用,请告诉我,我将测试/使用您的代码来查找修复。

于 2013-08-22T07:12:35.973 回答
0

问题是,它\r被发送到第二个 scanf,从第一个 scanf 中剩余。

而且由于您使用 scanf 仅读取一个字符(顺便说一句,不推荐使用 -getchar()改为使用),因此它接受回车符 ( \r)。如果您仍想使用第二个 scanf,请刷新标准输入:fflush(stdin)在第一个 scanf() 之后。

于 2013-08-22T06:38:22.307 回答