0

我创建了一个堆栈来解决一个问题。这是插入功能:

insert()
{
    char data;
    scanf("%c",&data);
    struct node* newNode=create_node(data);//creates a new node
    if(head==NULL)
    {
        head=newNode;
        tail=head;
        return;

    }
    newNode->next=head;
    head=newNode;
    return;

现在,我尝试像这样在堆栈中推送一些元素,

main()
{
    char input[20];
    insert();
    insert();
    insert();
    insert();
    insert();
    print();
}

但是我注意到每次插入后的插入跳过了。所以当我应该取5时它只需要3 个输入..即,我在取 3 个输入后给出输出。

我能够通过在插入函数中添加一个fflush来解决这个问题。

我想知道导致这种情况的实际情况。 这是否意味着我们不能像我那样接受输入?

4

1 回答 1

4

代替

scanf("%c", &data); 

scanf(" %c", &data); 

解决问题。后面的空格字符%c跳过所有空白字符,包括无,直到 C11 标准中指定的第一个非空白字符:

7.21.6.2 fscanf 函数

[...]

  1. 由空白字符组成的指令通过读取输入直到第一个非空白字符(仍然未读取)或直到无法读取更多字符来执行。该指令永远不会失败

\n您的程序只使用 3 个输入而不是 5 个输入的原因是因为标准输入流 () 中有一个换行符( stdin)。Enter输入数据后记得按scanf?此字符(换行符或\n未被this 捕获scanf。这个字符在下次调用时被scanfwith捕获。%c这就是为什么scanf它不等待进一步的输入并“跳过”一些输入。

函数fflush与 一起使用时stdin可能某些实现中起作用,尽管该行为被标准称为未定义:

7.21.5.2 fflush 函数

[...]

  1. 如果 stream 指向未输入最近操作的输出流或更新流,则该fflush函数会将该流的任何未写入数据传递到主机环境以写入文件;否则,行为未定义。
于 2015-04-10T09:44:24.977 回答