【问题标题】:In the code,why using fflush fixes the output?在代码中,为什么使用 fflush 修复输出?
【发布时间】:2015-04-10 09:41:02
【问题描述】:

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

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 之后的 insert 都被跳过了。所以当我应该采用 5 时它只需要 3 输入..即,i 在接受 3 个输入后给出输出。

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

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

【问题讨论】:

  • 谢谢,这解决了问题。
  • 你做了fflush(stdin)吗?
  • 是的,我猜它会刷新(或删除)换行符,否则它将作为下一个 scanf() 的输入。
  • 好的。 fflush(stdin) 适用于 Linux 和 windows,但在标准 C 中是 undefined。一般来说,您应该避免使用 scanf() 系列函数来处理用户输入,因为它们在处理错误/无效输入时不是很有用.

标签: c input stack fflush


【解决方案1】:

替换

scanf("%c", &data); 

scanf(" %c", &data); 

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

7.21.6.2 fscanf 函数

[...]

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

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

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

7.21.5.2 fflush 函数

[...]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多