在代码中,为什么使用fflush修复输出?

时间:2015-04-10 09:41:02

标签: c input stack fflush

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

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();
}

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

我能够通过在插入功能中添加 fflush 来解决问题。

我想知道实际发生了什么导致这个...... 这是否意味着我们不能像我一样接受输入?

1 个答案:

答案 0 :(得分:4)

替换

scanf("%c", &data); 

scanf(" %c", &data); 

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

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败
  2.   

您的程序仅使用3个输入而不是5个输入的原因是因为标准输入流(\n)中存在换行符(stdin)。记住在输入scanf的数据后按 Enter ?此\n捕获的此字符(换行符或scanf。当scanf%c下次调用时,此角色会被scanf捕获。这就是为什么fflush不等待进一步输入并“跳过”某些输入的原因。

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

  

7.21.5.2 fflush功能

     

[...]

     
      
  1. 如果流指向未输入最新操作的输出流或更新流,则{{1}}函数会将该流的任何未写入数据传递到主机环境以写入文件;否则,行为未定义。
  2.