C中的错误扫描

时间:2016-09-24 10:20:31

标签: c scanf

我的大学任务是编写一个小程序,用于计算二次方程,用户以这种格式输入:ax ^ 2 + bx + c = 0(例如3x ^ 2 + 2x-3 = 0)。我的程序必须扫描a,b和c并计算方程的根。我写这个来扫描系数:

scanf("%fx^2+%fx+%f=0", &a, &b, &c);

它对这样的方程式的工作:2x ^ 2 + 2x + 3 = 0。但是当我的方程中带有“ - ”(例如1x ^ 2 + 1x-2 = 0)时,扫描无法正常工作。它扫描1和1是真的,但不是-2而是扫描错误的真正大数字。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我使用2个字符输入符号,然后从最后一个printf中删除它们     浮动a,b,c;     char op1,op2;

scanf("%fx^2%c%fx%c%f=0", &a,&op1,&b,&op2, &c);
if(op1 == '-')
{
    b *= -1;
    // fix formating for last printf
    op1 = '\b';
}
if(op2 == '-')
{
    c *= -1;
    // fix formating for last printf
    op2 = '\b';
}
printf("a = %f\nb = %f\nc = %f\n",a,b,c);

// if op1 or op2 are '-' it won't be printed
printf("%fx^2%c%fx%c%f=0\n", a,op1,b,op2,c);

答案 1 :(得分:0)

让我们引用scanf()关于%f说明符的文档:

  

一系列十进制数字,可选地包含小数点,可选地前面带有符号(+或 - ),并且可选地后跟e或E字符和十进制整数(或strtod支持的一些其他序列)。

因此,说明符%f负责符号,无需阅读。请尝试:

if(scanf("%fx^2%fx%f=0", &a,&b, &c)!=3){
   fprintf(stderr," unable to read input\n");exit(1);
}

它不会解决以下情况:

  • X + 3 = 0
  • 3×^ 2 + x = 0的