c - fseek(stdin,0,SEEK_SET) 和 rewind(stdin) 确实会刷新输入缓冲区 "stdin"。可以使用它们吗?

标签 c stdin fseek fflush

<分区>

我从一开始就在想为什么 fseek(stdin,0,SEEK_SET)rewind(stdin) 不能刷新输入缓冲区,因为它写得很清楚在 cplusplusreference 中调用这两个函数刷新缓冲区(输入或输出无关)。但由于整个想法似乎很新,我昨天把它放在一个笨拙的问题中。

Can fseek(stdin,1,SEEK_SET) or rewind(stdin) be used to flush the input buffer instead of non-portable fflush(stdin)?

我对我得到的答案持怀疑态度,这些答案似乎暗示我做不到。坦率地说,我没有理由不这样做。今天我自己试了一下,它有效!!我的意思是,要在使用多个 scanf() 语句时处理 newline 潜伏在 stdin 上的问题,似乎我可以使用 fseek(stdin,0 ,SEEK_SET)rewind(stdin) 代替不可移植和 UB fflush(stdin)

请告诉我这是否是一种没有任何风险的正确方法。到目前为止,我一直在使用以下代码来处理 stdin 中的换行符:while((c = getchar( )) != '\n' && c != EOF);.下面是我的代码:

#include <stdio.h>

int main ()
{
    int a,b;
    char c;
    printf("Enter 2 integers\n");
    scanf("%d%d",&a,&b);
    printf("Enter a character\n");

    //rewind(stdin);   //Works if activated
    fseek(stdin,0,SEEK_SET);  //Works fine

    scanf("%c",&c);  //This scanf() is skipped without fseek() or rewind()
    printf("%d,%d,%c",a,b,c);

}

在我的程序中,如果我不使用 fseek(stdin,0,SEEK_SET)rewind(stdin) 中的任何一个,则第二个 scanf( ) 被跳过,换行符总是 被当作字符。如果我使用 fseek(stdin,0,SEEK_SET) 问题就解决了倒带(标准输入)

最佳答案

我不确定您在 cplusplusreference哪里读到(无论那是什么)刷新到行尾是强制行为。

我能找到的最接近的匹配项,http://www.cplusplus.com/reference/cstdio/fseek/http://www.cplusplus.com/reference/cstdio/rewind ,除了引用 fflush() 之外,根本不提刷新。

无论如何,C 标准中也没有任何内容强制执行此行为。 C11 7.20.9.2 fseek7.20.9.5 rewind(毕竟,与零偏移和 SEEK_SET< 的 fseek 相同) 也没有提到冲洗。

它们只是声明文件指针已移动到流中的相关位置。

因此,就这在您的环境中起作用的程度而言,我们只能说这在您的环境中起作用。它可能在其他地方不起作用,它甚至可能在未来某个不确定的时间点停止在您的环境中工作。


如果您真的想要稳健的输入,您应该使用两阶段方法,fgets 检索一行,然后是 sscanf 从该行获取您想要的内容.混合输入的两种范例(scanfgetchar)经常会出现问题。

可以找到一个很好的(健壮的、错误检查的和清除到行尾的)输入函数 here .

关于c - fseek(stdin,0,SEEK_SET) 和 rewind(stdin) 确实会刷新输入缓冲区 "stdin"。可以使用它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16684463/

相关文章:

c - 成功调用 fseek() 函数会清除流的文件结束指示器

c++ - C 和 C++ 标准是否暗示地址空间中的特殊值必须仅存在以表示空指针的值?

c - 数组被不相关的函数更改

c - fgets() 无法正常工作

Java:在单独的进程中运行 Callable

c - fseek() 和 ftell() 在循环中失败

iphone - 来自 View Controller 类中的某个类调用方法

c++ - 消除遗传性过长宏

java - Java-以标准语言编写?

c - 覆盖到c中的特定行