fflush(stdin)和rewind(stdin)

#include <stdio.h>
#include <math.h>
int main()
{
    double a, b, c, disc, x1, x2, p, q, i;
    do
    {

        scanf_s("a=%lf,b=%lf,c=%lf", &a, &b, &c);
        i = b*b - 4 * a*c;

    } while (i<0);
    printf("输入正确");

    disc = b*b - 4 * a*c;
    p = -b / (2 * a);
    q = sqrt(disc) / (2 * a);
    x1 = p + q, x2 = p - q;
    printf("x1=%5.2f\nx2=%5.2f\n", x1, x2);
    return 0;
}

在群中有人问了此例,算一元二次方程,scanf()在vs2015中不能用,所以我将其改为了scanf_s()。

当时我认为其输入的:

a=1,b=2,c=3

不满足其输入正确的条件,所以要接着输入a=?,b=?,c=?这些,然而并不能继续输入,按其他键无任何反应,有人回复用fflush(stdin);即可,即:

#include <stdio.h>
#include <math.h>
int main()
{
    double a, b, c, disc, x1, x2, p, q, i;
    do
    {
        fflush(stdin);
        scanf_s("a=%lf,b=%lf,c=%lf", &a, &b, &c);
        i = b*b - 4 * a*c;

    } while (i<0);
    printf("输入正确");

    disc = b*b - 4 * a*c;
    p = -b / (2 * a);
    q = sqrt(disc) / (2 * a);
    x1 = p + q, x2 = p - q;
    printf("x1=%5.2f\nx2=%5.2f\n", x1, x2);
    return 0;
}

然而在我的vs2015上面仍不能运行,接着我去百度查询。

发生第二次循环无法输入的原因在于输入缓冲区的问题,在读入一个数或字符之后紧接着要读取,此时应该清除输入缓冲区,而fflush(stdin)无法在vs2015中运行,其主要因为该函数功能虽然为:清空输入缓冲区,为确保不影响后面的数据读取。但需注意的是此函数仅适用于部分编译器,如vc6,并非所有编译器都支持这个函数。最合适的做法是加rewind(stdin)。

#include <stdio.h>
#include <math.h>
int main()
{
    double a, b, c, disc, x1, x2, p, q, i;
    do
    {
        rewind(stdin);
        scanf_s("a=%lf,b=%lf,c=%lf", &a, &b, &c);
        i = b*b - 4 * a*c;

    } while (i<0);
    printf("输入正确");

    disc = b*b - 4 * a*c;
    p = -b / (2 * a);
    q = sqrt(disc) / (2 * a);
    x1 = p + q, x2 = p - q;
    printf("x1=%5.2f\nx2=%5.2f\n", x1, x2);
    return 0;
}

或者在紧接着读取之前输出某些:

#include <stdio.h>
#include <math.h>
int main()
{
    double a, b, c, disc, x1, x2, p, q, i;
    do
    {
        printf("输入a,b,c:");
        scanf_s("%lf%lf%lf", &a, &b, &c);
        i = b*b - 4 * a*c;

    } while (i<0);
    printf("输入正确");

    disc = b*b - 4 * a*c;
    p = -b / (2 * a);
    q = sqrt(disc) / (2 * a);
    x1 = p + q, x2 = p - q;
    printf("x1=%5.2f\nx2=%5.2f\n", x1, x2);
    return 0;
}
时间: 2024-12-14 07:20:43

fflush(stdin)和rewind(stdin)的相关文章

8.6 文件IO fflush fseek ftell rewind feof ferror

fprintf()  . sprintf. snprintf : int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...); #include <stdio.h> int main() { FILE * fp = fopen(&q

VC6.0建立控制台程序

作者:iamlaosong 因为需要,又写起了文本界面的程序,以便PDA通过telnet连上执行.如果是Linux服务器的话,这是很简单的事,可是用户服务器是windows server 2003,所以就需要安装telnet服务,开发一个控制台程序.telnet服务器软件使用开源软件KpyM Telnet/SSH Server,控制台程序就用VC6.0来做了.网上搜了一下,通过下面链接操作即可: 怎么用VC6.0建立控制台程序 建议不要建立一个空程序,而是建立一个"Hello,World!&qu

c语言:C语言清空输入缓冲区在标准输入(stdin)情况下的使用

C语言清空输入缓冲区在标准输入(stdin)情况下的使用 程序1: //功能:先输入一个数字,再输入一个字符,输出hello bit #include <stdio.h> int main() { int num = 0; char ch = ' '; scanf("%d", &num); scanf("%c", &ch); printf("hello bit\n"); system("pause"

scanf()中清除输入缓冲区的几种方法归纳

应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种问题, 总的思想:通过各种方法将输入缓冲区的内容读出来. 方法一:使用scanf("%*[^\n]%*c"):成功; 解释: 1.这里的星号'*'表示读入某类型的内容,但是这个内容不保存到变量里,所以后面不需要对应的参量; 也就是说,只要我再%后面加入星号之后,后没可以不放置接收的变量.

第二天_C语言学习

 关键字 在C语言中有特殊含义的单词  标识符    26个英文字母,0-9数字,_组成. 首字符不能为数字,不能和关键字同名  注释 #include <stdio.h> //单行注释 //单行注释作用范围: 从第二个/开始,直到这行结束 (除非\,则可以从下一行开始继续单行注释) //注释不会参与编译,这个是给程序猿看的 /* 多行注释 /星 星/ */ //多行注释作用范围: 从/*开始 一直到遇到遇到第一个*/结束 //注释不会参与编译,这个是给程序猿看的 /* 该方法用于根据一个电话

linux 操作系统下c语言编程入门

2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设计入门--网络编程 9)Linux下C开发工具介绍 1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编

C语言初学者简单语法综合练习

本次练习包括一维数组(含字符型数组)的相关知识,建议学习一维数组后做下面练习,如果可以独立完成下面习题的80%,证明你已经比较熟练的掌握相关语法,可以向函数及指针部分进军了,如果没能顺利完成,请参看相关程序,参考程序系本人所写,难免有纰漏之处,有任何疑问敬请留言. 题目目录如下: 登录验证用户邮箱格式验证判断平年/闰年自定义金字塔计算器冒泡法排序 1.登录验证要求:模拟用户登录过程,验证用户名.密码和校验码,如果全部正确提示用户登录成功,否则,提示用户相关输入错误.目的:掌握登录校验的规则和原理

2017年4月13日用VS写C程序遇到的一些问题

在网上找到一篇展示计算机浮点数格式的文章,且有C代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() { float f; double d; char bs[65]; char b[65]; char s[80]; unsigned char *p; char e[12]; char *t; int ex; while

Linux系统编程_4_标准I/O(附:清空缓冲区方法)

标准I/O属于库文件,系统调用和库是有区别的,为了方便,标准库中实现了和所有系统调用同名的函数:参考<APUE> 这里部分不解释过多,网上的资料很多,其实熟悉的人基本都知道,我们不可能记住所有的函数的,特别是参数等等,我们能做的就是尽量熟悉他,用到时查一下就能用就行了. 标准I/O函数,摘自于网络: 当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针.该对象通常是一个结构,它包含了标准I/O库为管理该流所需的所有信息,包括:用于实际I/O的文件描述符.指向用于该缓冲区的指针