非常基本的scanf程序不能在c中工作,不理解为什么



我是c的新手,我正在尝试学习如何使用scanf函数传入数据,然后使用printf函数向我显示打印结果。

这看起来应该是eas,y,但我预期的输出与返回的不匹配。我的IDE是vscode

#include <stdio.h>
#define pi 3.14159
int main()
{
float size;
float radius;
scanf("this is the value : %f",&radius);
size = (2/3)*pi*(radius*radius*radius);
printf("%f",size);
return 0;
}

在这里你可以看到我输入的内容和打印的

在那之后,我制作了一个更容易理解这个概念的程序,我遇到了一个类似但不同的问题。而不是每次都返回0,现在它打印相同的常量

#include <stdio.h>
int main() 
{ 
int a; 
scanf("This is the value %d", &a); 
printf("Input value read : a = %d", a); 
return 0; 
}

在这里你可以看到我得到的第二个程序的输出

有什么问题吗?我该怎么解决?

您似乎希望scanf打印一条消息,然后获取一个值:

scanf("this is the value : %f",&radius);

。这只需打印消息,然后用scanf:获取值即可获得

printf("Please insert the value :n");
if (scanf ("%f",&radius) == 1)
{
/* ... */
}

请注意scanf返回值的检查,即成功获取的变量的数量。在这种情况下,我们希望它是1,因为唯一的格式说明符是%f

%f之前的消息使scanf实际上期望恰好浮点数之前的字符串(包括空格(。只插入输入数字(在您的示例中为5(会使scanf放弃输入,因为它与给定的字符串不匹配,并且没有存储任何值,因此radius保持未初始化状态,执行会导致未定义的行为。此外,用整数算法计算了前导2/3,结果为0;使用2.0/3.0强制使用浮点运算。


涉及%d的测试问题非常相似;您只会看到由于上述原因而未由scanf写入的CCD_ 12的随机未初始化值。