我现在有几个程序遇到这个问题,我无法弄清楚为什么会这样。这是我的代码:
#include <stdio.h>
#include <math.h>
int main(void){
double x = 0;
while(x <= 0){
printf("Enter a digit greater than 0.\n");
scanf("%lf", &x);
}
printf("%lf", &x);
}
,输出为:
Enter a digit greater than 0.
4
0.000000
请帮助
答案 0 :(得分:4)
使用以下代码
#include <stdio.h>
#include <math.h>
int main(void){
double x = 0;
while(x <= 0){
printf("Enter a digit greater than 0.\n");
scanf("%lf", &x);
}
printf("%lf", x);
}
您正在使用
printf("%lf", &x);
但是打印x值的正确语法是:
printf("%lf", x);
答案 1 :(得分:4)
首先,
printf ("%lf", &x);
将尝试打印x
的地址而不是其值,这显然是未定义的行为区域(a)。一个不太合适的编译器应警告你,例如gcc
:
program.c: In function 'main':
program.c:13: warning: format '%lf' expects argument of type
'double', but argument 2 has type 'double *' [-Wformat=]
printf ("%lf\n", &x);
^
其次,double的正常printf
说明符是%f
而不是%lf
。您可以使用后者,因为标准声明它对某些数据类型没有影响,但这样做有点浪费。
所以你需要的是:
printf ("%f", x);
一般规则是您将地址传递给scanf
,因为它需要填充这些地址的对象。对于printf
,您只需传递对象本身(是的,即使数据是您想要打印的指针作为指针而不是指向对象是指出)。
最后,为了使您的代码更加健壮,使用scanf
检测问题是明智的,因为输入的问题是x
设置为零,程序将连续尝试读取该输入,从而产生无限循环。
考虑所有这些意见,一个好的起点是:
#include <stdio.h>
#include <math.h>
int main (void) {
double x = 0;
while (x <= 0) {
printf ("Enter a digit greater than 0.\n");
if (scanf ("%lf", &x) != 1) {
printf ("Invalid input\n");
return 1;
}
}
printf ("%f\n", x);
return 0;
}
(a)具体来说,来自ISO C11 7.21.6.1 /9
:
如果任何参数不是相应转换规范的正确类型,则行为未定义。
答案 2 :(得分:3)
始终始终检查scanf
的回复,即printf ("%f", x);
- 没有&x
,不需要%lf
},printf
%f
格式说明符打印双打。 (但是在使用scanf
时需要它 - man scanf
和man printf
是您的朋友)
完全放弃,你可以安全地接受如下输入:
#include <stdio.h>
int main (void) {
double x = 0;
while(x <= 0){
printf ("Enter a digit greater than 0.\n");
if (scanf ("%lf", &x) != 1) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
}
printf ("%f", x);
}
注意:您必须在转换失败时退出循环(或在尝试再次输入之前清空stdin
- 否则您的输入将失败)原因:转换失败时 - 否读取其他字符,留下导致失败的字符,等待下次回合再次咬你......