C-空间中的scanf导致删除

C-空间中的scanf导致删除,c,scanf,C,Scanf,我写这段代码是为了找到一个二次方程的根。除非在扫描部分前面加一个空格,否则它似乎是有效的。(例如,我在输入中写入:a=1、b=2、c=1)。在这种情况下,它只是删除变量。(在我给出的示例中,c将从输入中删除,因此我收到的答案是0,-2,而不是-1。)。如果我将空格放在其他地方(a=1,b=2,c=1),代码就会工作 我如何解决这个问题 int main() { double root1 = 0, root2 = 0; double a = 0., b = 0., c = 0.;

我写这段代码是为了找到一个二次方程的根。除非在扫描部分前面加一个空格,否则它似乎是有效的。(例如,我在输入中写入:
a=1、b=2、c=1
)。在这种情况下,它只是删除变量。(在我给出的示例中,
c
将从输入中删除,因此我收到的答案是0,-2,而不是-1。)。如果我将空格放在其他地方(
a=1,b=2,c=1
),代码就会工作

我如何解决这个问题

int main()
{
    double root1 = 0, root2 = 0;
    double a = 0., b = 0., c = 0.;
    printf("Enter a polynomial:\n");
    scanf("a=%lf,b=%lf,c=%lf", &a, &b, &c);

    {
        if (a == 0)
        {
            return 0;
        }
        if ((b * b - 4 * a * c) == 0)
        {
            root1 = -b / 2 * a;
            printf("root is %f", root1);
        }
        else if ((b * b - 4 * a * c) < 0)
        {
            printf("There are no roots");
        }
        else {
            root1 = (-b + sqrt(b * b - 4 * a * c)) / 2* a;
            root2 = (-b - sqrt(b * b - 4 * a * c)) / 2* a;
            printf("Roots are %f,%f", root1, root2);
        }
    }
    return 0;
}
intmain()
{
双根1=0,根2=0;
双a=0,b=0,c=0。;
printf(“输入多项式:\n”);
scanf(“a=%lf,b=%lf,c=%lf”,&a,&b,&c);
{
如果(a==0)
{
返回0;
}
如果((b*b-4*a*c)==0)
{
root1=-b/2*a;
printf(“根是%f”,根1);
}
如果((b*b-4*a*c)<0)
{
printf(“没有根”);
}
否则{
root1=(-b+sqrt(b*b-4*a*c))/2*a;
root2=(-b-sqrt(b*b-4*a*c))/2*a;
printf(“根是%f,%f”,根1,根2);
}
}
返回0;
}

无法解决此问题;这实际上是函数scanf()的问题;它本身或者,可以使用fgets();相反 试着替换

double a=0.,b=0.,c=0.;
printf("Enter a polynomial:\n");
scanf("a=%lf,b=%lf,c=%lf",&a,&b,&c);


没有办法解决这个问题;这实际上是函数scanf()的问题;它本身或者,可以使用fgets();相反 试着替换

double a=0.,b=0.,c=0.;
printf("Enter a polynomial:\n");
scanf("a=%lf,b=%lf,c=%lf",&a,&b,&c);


使用允许在意外位置留出空间的格式。并检查结果

//         v v    v v v    v v v
if (scanf(" a =%lf , b =%lf , c =%lf", &a, &b, &c) == 3) Oh_Happy_day();
“%lf”
前面不需要空格,因为该说明符将扫描前导空格。有些人喜欢直言不讳

//             x         x         x Optional
if (scanf(" a = %lf , b = %lf , c = %lf", &a, &b, &c) == 3) Oh_Happy_day();


最好使用
fgets()
读取一行,然后对其进行解析。

使用允许在意外位置留出空间的格式。并检查结果

//         v v    v v v    v v v
if (scanf(" a =%lf , b =%lf , c =%lf", &a, &b, &c) == 3) Oh_Happy_day();
“%lf”
前面不需要空格,因为该说明符将扫描前导空格。有些人喜欢直言不讳

//             x         x         x Optional
if (scanf(" a = %lf , b = %lf , c = %lf", &a, &b, &c) == 3) Oh_Happy_day();


最好使用
fgets()
读取一行,然后解析它。

因为空格不是scanf中使用的格式字符串的一部分

应在格式字符串中添加前导空格:

scanf(" a=%lf, b=%lf, c=%lf", &a, &b, &c);

因为空格不是scanf中使用的格式化字符串的一部分

应在格式字符串中添加前导空格:

scanf(" a=%lf, b=%lf, c=%lf", &a, &b, &c);

只需输入1,2,1,然后输入,因为前导空格不是格式字符串的一部分。忘记那些愚蠢的逗号和严格的输入规范,只是不要键入任何字符<代码>printf(“输入多项式a b c:\n”);扫描(“%lf%lf%lf”、&a、&b和&c)然后输入
1 2 1
或用
换行符分隔。Nit:
“没有根”
-->
“没有真正的根”。发布的代码不会编译。它似乎缺少头文件的
#include
语句:
stdio.h
math.h
只需输入1,2,1,然后输入,因为前导空格不是格式字符串的一部分。忘记那些愚蠢的逗号和严格的输入规范,只需不键入任何字符即可<代码>printf(“输入多项式a b c:\n”);扫描(“%lf%lf%lf”、&a、&b和&c)然后输入
1 2 1
或用
换行符分隔。Nit:
“没有根”
-->
“没有真正的根”。发布的代码不会编译。它似乎缺少头文件的
#include
语句:
stdio.h
math.h
不是这样(也就是说,有办法解决这个问题);问题在于
scanf()
被滥用了。不是这样(也就是说,有办法解决这个问题);问题在于
scanf()
被滥用。格式字符串现在更好了,但会拒绝输入启动
a=1.23
。也许这是必需的,但是
“a=%lf,b=%lf,c=%lf”
会更灵活。
%lf
前面的空格不需要保持灵活性,但它们使格式更加对称。您还应该从
scanf()
测试结果,以确保成功转换了3个值。当然,让人们键入
a=1.23,b=2.34,c=3.45
符号是令人不快的,特别是当他们没有灵活性键入
b=2.34,c=3.45,a=1.23
(这将证明额外键入是正确的)。格式字符串现在更好了,但会拒绝从
a=1.23
开始的输入。也许这是必需的,但是
“a=%lf,b=%lf,c=%lf”
会更灵活。
%lf
前面的空格不需要保持灵活性,但它们使格式更加对称。您还应该从
scanf()
测试结果,以确保成功转换了3个值。当然,让人们键入
a=1.23,b=2.34,c=3.45
符号是令人不快的,尤其是因为他们没有灵活性键入
b=2.34,c=3.45,a=1.23
(这将证明额外键入是合理的)。