为什么你不能在C中写scanf(“%。2lf”,&a)?

我的朋友刚开始学习编程。 他向我展示了他的代码并询问为什么它会返回一些奇怪的数字。 看了之后,我看到他正在使用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 co 2 nghiem la:%.2lf, %.2lf",-(b-sqrt(delta))/(4*a),-(b+sqrt(delta))/(4*a)); } return 0; } 

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

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

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

另外, lf指定值应为double ,因此a应为double类型。

发布的代码不起作用,因为它会导致未定义的行为。 这个. character不是scanf()格式字符串的有效指令或修饰符。 根据C标准的第7.21.6.2节, “如果转换规范无效,则行为未定义” 。

令人恐惧的是,未定义行为的一个后果可能是代码似乎有效,至少有时候。 但是代码可能会在不同的情况下或在不同的平台上失败。 这突出了始终阅读所使用的任何function的文档的重要性,特别注意标准所说的内容。