Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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程序中的双标识符(%lf)_C_Printf_Double_Scanf_Codeblocks - Fatal编程技术网

代码::块不能识别简单C程序中的双标识符(%lf)

代码::块不能识别简单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() {

今天我决定重温一下C编程语言的基础知识,我在代码::Blocks IDE中遇到了一个小问题:当我使用%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试图对字符串常量内容应用某种拼写检查,而不管printfscanf格式字符串中的转换说明符如何

我建议您将
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
,输出也是正确的。同时,我发现我的问题在其他帖子中也有描述: