Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么你必须';不能用C写scanf(“%.2lf”和“a”)?_C_Scanf - Fatal编程技术网

为什么你必须';不能用C写scanf(“%.2lf”和“a”)?

为什么你必须';不能用C写scanf(“%.2lf”和“a”)?,c,scanf,C,Scanf,我的朋友刚刚开始学习编程。他给我看了他的代码,问为什么它会返回一些奇怪的数字。看了一眼之后,我发现他正在使用scanf(“%.2lf”,&a)来获取输入,我习惯性地尝试将其更改为正常。然后他问我为什么它有一些奇怪的输出。在谷歌上搜索之后,我仍然没有找到答案 有人能告诉我为什么它不起作用吗 提前谢谢你,很抱歉我讲了这么长不相关的故事,还有我的英语不好 编辑:在下面添加代码 int main() { double a,b,c,delta; printf

我的朋友刚刚开始学习编程。他给我看了他的代码,问为什么它会返回一些奇怪的数字。看了一眼之后,我发现他正在使用scanf(“%.2lf”,&a)来获取输入,我习惯性地尝试将其更改为正常。然后他问我为什么它有一些奇怪的输出。在谷歌上搜索之后,我仍然没有找到答案

有人能告诉我为什么它不起作用吗

提前谢谢你,很抱歉我讲了这么长不相关的故事,还有我的英语不好

编辑:在下面添加代码

    int main()
    {
        double a,b,c,delta;
        printf("Nhap vao 3 so thuc a,b,c: \n");
        scanf("%.2lf %.2lf %.2lf",&a,&b,&c);
        if(a == 0 && b == 0 && c == 0) printf("Phuong trinh co vo so nghiem");
        else if(a == 0 && b == 0 && c != 0) printf("Phuong trinh vo nghiem");
        else if(a == 0 && b != 0) printf("Phuong trinh co 1 nghiem la: %.2lf",-c/b);
        else if(a != 0)
        {
            delta=b*b-4*a*c;
            if(delta<0) printf("Phuong trinh vo nghiem");
            else if(delta == 0) printf("Phuong trinh co nghiem kep: %.2lf",-b/(2*a));
            else if(delta > 0) printf("Phuong trinh co 2 nghiem la:%.2lf, %.2lf",-(b-sqrt(delta))/(4*a),-(b+sqrt(delta))/(4*a));
        }
        return 0;
    }
intmain()
{
双a,b,c,δ;
printf(“Nhap vao 3 so thuc a、b、c:\n”);
scanf(“%.2lf%.2lf%.2lf”、&a、&b和&c);
如果(a==0&&b==0&&c==0)printf(“Phuong trinh co vo so nghiem”);
如果(a==0&&b==0&&c!=0)printf(“Phuong trinh vo nghiem”);
否则,如果(a==0&&b!=0)printf(“Phuong trinh co 1 nghiem la:%.2lf”,-c/b);
如果(a!=0),则为else
{
δ=b*b-4*a*c;
如果(δ0)printf(“Phuong trinh co 2 nghiem la:%.2lf,%.2lf”,-(b-sqrt(δ))/(4*a),-(b+sqrt(δ))/(4*a));
}
返回0;
}

C标准指定
scanf
转换说明符以
%
开头,而POSIX标准指定它们以
%
%n$
开头

C标准和POSIX标准都不允许在转换说明符中使用
,因此此字符无效

在类型说明符之前的转换说明符中可能有一个十进制整数,但它指定了类型的最大字段宽度。这意味着当通过
%2lf
时,
scanf
将在停止前读取最多2个字符


此外,
lf
指定值应为
double
,因此a应为
double
类型。C标准指定
scanf
转换说明符以
%
开头,POSIX标准指定它们以
%
%n$
开头

C标准和POSIX标准都不允许在转换说明符中使用
,因此此字符无效

在类型说明符之前的转换说明符中可能有一个十进制整数,但它指定了类型的最大字段宽度。这意味着当通过
%2lf
时,
scanf
将在停止前读取最多2个字符


此外,
lf
指定值应为
double
,因此a应为
double

类型。发布的代码不起作用,因为它会导致未定义的行为。
字符不是
scanf()
格式字符串的有效指令或修饰符。根据C标准§7.21.6.2 13


令人恐惧的是,未定义行为的一个后果可能是代码似乎可以工作,至少有时是这样。但是,在不同的环境下,或者在不同的平台上,代码可能会出现惊人的失败。这突出了始终阅读任何正在使用的函数的文档的重要性,并特别注意标准的说明。

发布的代码不起作用,因为它会导致未定义的行为。
字符不是
scanf()
格式字符串的有效指令或修饰符。根据C标准§7.21.6.2 13


令人恐惧的是,未定义行为的一个后果可能是代码似乎可以工作,至少有时是这样。但是,在不同的环境下,或者在不同的平台上,代码可能会出现惊人的失败。这突出了始终阅读任何正在使用的函数的文档的重要性,并特别注意标准中的说明。

什么不起作用?对于
scanf
转换规范来说,它不是有效的语法。对
printf()
有效的内容不一定对
scanf()
有效。没什么好说的了。具体来说,点是无效的。你能给我们看看a的声明吗?@JonathanLeffler好的,谢谢,但我认为如果语法无效,它应该有编译错误?它是有效的C语法。使用
scaff()
是无效的。编译器做了很多工作;有些人会这样诊断。其他人则不然。你有责任知道自己在做什么。编译器确实假设了这一点。什么不起作用?对于
scanf
转换规范,它的语法无效。对
printf()
有效的内容不一定对
scanf()
有效。没什么好说的了。具体来说,点是无效的。你能给我们看看a的声明吗?@JonathanLeffler好的,谢谢,但我认为如果语法无效,它应该有编译错误?它是有效的C语法。使用
scaff()
是无效的。编译器做了很多工作;有些人会这样诊断。其他人则不然。你有责任知道自己在做什么。编译器确实假设。