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
(这将证明额外键入是合理的)。