scanf()不等待用户输入

时间:2013-08-22 05:38:59

标签: c scanf

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

请协助。

3 个答案:

答案 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限制符合字符串的字符数。

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