代码::块不能识别简单C程序中的双标识符(%lf)
今天我决定重温一下C编程语言的基础知识,我在代码::Blocks IDE中遇到了一个小问题:当我使用代码::块不能识别简单C程序中的双标识符(%lf),c,printf,double,scanf,codeblocks,C,Printf,Double,Scanf,Codeblocks,今天我决定重温一下C编程语言的基础知识,我在代码::Blocks IDE中遇到了一个小问题:当我使用%f格式标识符读写十进制数时,一切都进行得很顺利,但当我切换到%lf格式标识符时,它没有正确读取或写入数字 这是我的代码: #include <stdio.h> int main() { double x; scanf("%lf", &x); printf("x = %lf", x); return 0; } #包括 int main() {
%f
格式标识符读写十进制数时,一切都进行得很顺利,但当我切换到%lf
格式标识符时,它没有正确读取或写入数字
这是我的代码:#include <stdio.h>
int main()
{
double x;
scanf("%lf", &x);
printf("x = %lf", x);
return 0;
}
#包括
int main()
{
双x;
扫描频率(“%lf”、&x);
printf(“x=%lf”,x);
返回0;
}
这是输出:以下是“代码::块”菜单中的编译器设置:
我在网上搜索了一个解决方案,包括Code::Blocks论坛,但没有找到任何相关的解决方案。我不确定是编译器问题还是IDE问题。如果你知道一个修复方法或者你对这个问题有一个解释,请帮助我。我确信其他人也遇到过这种情况。不清楚Code::Blocks警告了什么。
scanf
格式字符串中的lf
也有下划线,但绝对正确,因为目标变量的类型为double
对于printf
,不需要l
修饰符,但应被printf
忽略<代码>浮点值在传递给vararg函数(如printf
)时转换为double
,因此%f
接受浮点
和双精度
值,而长双精度
值需要L
修饰符
建议的更正似乎表明Code::Block试图对字符串常量内容应用某种拼写检查,而不管printf
和scanf
格式字符串中的转换说明符如何
我建议您将printf
格式字符串更改为printf(“x=%f\n”,x)代码>表示完全符合要求
您还应该将编译器配置为更高的警告级别(-Wall-W
或-Weverything
),以启用printf
和scanf
格式字符串验证。此线程中为感兴趣的人详细描述了此问题:
您已经清楚地提出了问题,但请将代码作为文本而不是图像发布。这将使其他人更容易复制以试用或评论。您的配置看起来正确<代码>%lf
从C99起就得到了支持(即允许),但由于%f
正确打印double
(没有float
到printf
;float变为double)。您使用的是哪个版本的
gcc`以及是否有可能看到代码块发出的实际构建命令?Fwiw,后来的标准(C11)专门为转换d、i、o、u、x、
或x
定义了l
修饰符的行为,并且它在printf中前面的f
时没有影响,所以我很好奇切换到C11时行为是否会改变。@kaylum谢谢你的提示!我这样做主要是为了显示当鼠标悬停在标识符上时突出显示的内容。@WhozCraig我将编译器切换到C11,但结果是一样的。当我取消选中-std=c99选项时,一切都很顺利(我假设它使用了C89)。无论如何,修复方法是使用printf(“x=%f”,x)代码>。我的假设是该值读取正确,但显示格式标识符错误,因为如果gven参数确实是双精度的,printf会自动将浮点值提升为双精度。@RevnicRobert Nick Code::Blocks在更改printf
后仍然为scanf
提供下划线,如果我使用printf(“x=%f\n”,x)代码>,将显示正确的值。这里需要特别说明的是:如果我使用C89标准,即使我在printf
函数中使用%lf
,输出也是正确的。同时,我发现我的问题在其他帖子中也有描述: