首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fflush(stdin)和flushstdin()的区别

fflush(stdin)和flushstdin()的区别
EN

Stack Overflow用户
提问于 2015-06-05 20:13:25
回答 2查看 2.3K关注 0票数 4

使用fflush(stdin)flushstdin()有什么区别?我所知道的唯一不同之处是,在使用flushstdin()之前,我需要写一些空洞的东西,但我不知道为什么。

代码语言:javascript
复制
void flushstdin()
{
    int c;
    while((c = getchar()) != '\n' && c != EOF); 
}
int main () {
    float a, b, c;
    float s=0, ar1=0, ar2=0;
    printf("Inform value of side A");
    while(scanf("%f",&a) != 1 || a <= 0){ 
        printf("Invalid value.\n");
        flushstdin();
    }
}

代码语言:javascript
复制
int main(){
    float a,b,c,s=0;
    printf("Inform value of side A.");
    while(scanf("%f",&a) != 1 || a<=0){
        printf("Invalid value.\n");
        fflush(stdin);
    }
}

我是初学者!哪种代码是最好的?还是他们是平等的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-05 21:07:32

这两个版本都有问题。

正如广泛记录的那样,fflush(stdin)根据C标准有未定义的行为。使用flushstdin()函数的替代方法也不是很好。我建议一次只读取一行标准输入,然后用sscanf()解析它,所有这些都是可以根据需要使用的实用函数:

代码语言:javascript
复制
int readfloat(const char *prompt, float *val) {
    char buf[128];
    for (;;) {
        if (prompt) 
            fputs(prompt, stdout);
        if (!fgets(buf, sizeof(buf), stdin)) {
            printf("Premature end of file\n");
            return 1;
        }
        if (sscanf(buf, "%f", val) == 1 && *val > 0)
            return 0;
        printf("Invalid value.\n");
    }
}

int main(void) {
    float a, b, c, s = 0;
    if (readfloat("Enter value of side A: ", &a))
        return 1;
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2015-06-05 20:15:30

不同的是,flushstdin是用户定义的,是标准C中刷新stdin的唯一方法。

fflush是一个标准的库函数。fflush(stdin);将调用未定义的行为。

c-常见问题:12.26 a

fflush 仅为输出流定义。由于它对“刷新”的定义是完成缓冲字符的写入(而不是丢弃它们),因此对于输入流上的fflush来说,丢弃未读输入并不是一个类似的意思。

C-常见问题: 12.26b

没有从stdio输入流中丢弃未读字符的标准方法。有些厂商确实实现了fflush fflush(stdin) ,这样fflush(stdin)就可以丢弃未读字符,尽管可移植程序不能依赖于这个。( stdio库的某些版本实现了fpurgefabort调用,它们做同样的事情,但它们也不是标准的。)还要注意的是,刷新stdio输入缓冲区并不一定足够:未读字符也可以在其他OS级输入缓冲区中积累。如果您试图主动放弃输入(可能是因为预期会发出意外提示来确认破坏性操作,而意外键入的"y“可能是灾难性的),您将不得不使用特定于系统的技术来检测类型化输入的存在;请参见问题19.1和19.2。请记住,如果您丢弃了输入速度过快的输入,用户可能会感到沮丧。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30675045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档