scanf功能不起作用

时间:2018-03-09 01:57:12

标签: c scanf

我现在有几个程序遇到这个问题,我无法弄清楚为什么会这样。这是我的代码:

#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

请帮助

3 个答案:

答案 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);

检查工作代码https://ideone.com/lpdlmX

答案 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 scanfman 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 - 否则您的输入将失败)原因:转换失败时 - 否读取其他字符,留下导致失败的字符,等待下次回合再次咬你......