#include <stdio.h>
#include <stdlib.h>

int main()
{
    char buf[1024];
    int a,b;
    int i;
    
    setbuf(stdin, buf);
    scanf("%d %d", &a, &b);
    
    for(i=0; buf[i]!='\n'; i++){
        putchar(buf[i]);  
    }
    
    putchar('\n');

    return 0;
}

When I input the values 1 2, I used setbuf to find out if the buffer was really cleared after reading the values.
When I printed out the buf, however, the value I entered remained the same in buf. That is, the output was 1 2

Why is this happening?
I would really appreciate if you could answer.

推荐答案

以下是C标准对函数setbuf的描述:

7.21.5.5 The 100 function

Synopsis

#include <stdio.h>
void setbuf(FILE * restrict stream,
            char * restrict buf);

Description

除了不返回任何值外,setbuf函数相当于setvbuf函数,其调用值_IOFBF表示modeBUFSIZ表示size,或者(如果buf是空指针),_IONBF表示mode.

Returns

7.21.5.6 The 100 function

Synopsis

#include <stdio.h>
int setvbuf(FILE * restrict stream,
            char * restrict buf,
            int mode, size_t size);

Description

只有在stream指向的流与打开的文件关联之后,并且在流上执行任何其他操作(对setvbuf的调用不成功除外)之前,才能使用setvbuf函数.参数mode确定流将如何被缓冲,如下所示:参数_IOFBF使输入/输出被完全缓冲;_IOLBF使输入/输出被行缓冲;_IONBF使输入/输出无缓冲.如果buf不是空指针,可以使用它指向的数组,而不是由setvbuf函数277)分配的缓冲区,参数size指定数组的大小;否则,size可以确定由setvbuf函数分配的缓冲器的大小.数组的内容在任何时候都是不确定的.

Returns

setvbuf函数在成功时返回零,如果mode的值无效或请求无法满足,则返回非零.


277)缓冲区的生存期必须至少与开放流一样长,因此在块退出时释放具有自动存储持续时间的缓冲区之前,应该关闭流

因此:

  • 代码中的数组buf的长度应该是BUFSIZ,可以不同于1024.
  • 此数组不应具有自动存储类,因为在函数main返回之前,stdin未关闭.它应该被定义为static char buf[BUFSIZ];
  • 流处理功能可以使用缓冲区,也可以不使用缓冲区.
  • The contents of the array at any time are indeterminate,因此对缓冲区内容没有任何期望:您观察到用户输入存在,但这并不能保证.大多数实现在FILE struct 中都有指针或偏移量,以跟踪缓冲区的已用部分和可用部分.
  • 流处理函数不太可能在读取字节后重新加载缓冲区内容,因为它需要从文件中重新加载缓冲区,以防查找以前的内容,但同样也不能保证这一点.

setbuf是一个使用有限的传统功能,setvbuf优先 Select 缓冲模式和缓冲区大小,在极少数情况下可能有用.

C++相关问答推荐

为什么cudaFree不需要数据 struct 的地址?

如何在C++中处理按键

运行时错误:在索引数组时加载类型为';char';`的空指针

合并对 struct 数组进行排序

静态初始化顺序失败是否适用于C语言?

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

如何组合两个宏来初始化C语言中的字符串数组?

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

无算术运算符和循环的二进制乘法

可以对两种 struct 类型中的任何一种进行操作的C函数

'printf("%s", user_input)' 危险吗?

中位数和众数不正确

在 C 中传递参数时出现整数溢出

Clang 是否为内联汇编生成了错误的代码?

运行以下 C 程序时出现分段错误

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值

c 函数指针,另一种语法

我如何(合规地)从 tmpfile() 读取?

在 C 语言中,为什么 10/3 应该给出 3.333 却给出 3.000? (保存 10 和 3 的变量被声明为double)

在 C 语言中,不使用 sscanf 从字符串中读取数据