通过scanf无法正确分配值

时间:2017-01-14 16:45:03

标签: c function variables scanf

我在c中写了一个函数,它应该扫描四个值并将它们分配给四个变量:

double xmin,xmax,ymin,ymax;

double set(double xmin, double xmax, double ymin, double ymax){

printf("\nxmin:\t");
scanf(" %lf",&xmin);
printf("\nxmax:\t");
scanf(" %lf",&xmax);
printf("\nymin:\t");
scanf(" %lf",&ymin);
printf("\nymax:\t");
scanf(" %lf",&ymax);
printf("\n");

return xmin,xmax,ymin,ymax;}

稍后我在main函数中使用该函数时,某些值会丢失。我检查了调试器,发现这些值甚至没有首先分配。所以问题必须出在这个功能上。

2 个答案:

答案 0 :(得分:1)

函数set初始化自己的参数变量并返回最后一个变量。它使名称的全局变量保持不变。删除参数变量可以解决问题:

double xmin, xmax, ymin, ymax;

void set(void) {
    printf("\nxmin:\t");
    scanf(" %lf", &xmin);
    printf("\nxmax:\t");
    scanf(" %lf", &xmax);
    printf("\nymin:\t");
    scanf(" %lf", &ymin);
    printf("\nymax:\t");
    scanf(" %lf", &ymax);
    printf("\n");
}

但更好的方法是传递变量的地址,这些变量可以在main的本地变量,并检查scanf()的返回值是否正确转换:

int set(double *xmin, double *xmax, double *ymin, double *ymax) {
    printf("\nxmin:\t");
    if (scanf("%lf", xmin) != 1)
        return -1;
    printf("\nxmax:\t");
    if (scanf("%lf", xmax) != 1)
        return -1;
    printf("\nymin:\t");
    if (scanf("%lf", ymin) != 1)
        return -1;
    printf("\nymax:\t");
    if (scanf("%lf", ymax) != 1)
        return -1;
    printf("\n");
    return 0;
}

main()方式拨打电话:

int main(void) {
    double xmin, xmax, ymin, ymax;

    if (set(&xmin, &xmax, &ymin, &ymax)) {
        /* initialization error */
        exit(1);
    }
    ...
}

答案 1 :(得分:0)

将指针传递给您的值而不是值; return - 陈述已经过时;请注意,在scanf中,&符号已被删除,因为您已经指向了该值。

void (double *xmin, double *xmax, double *ymin, double *ymax) {
  printf("\nxmin:\t");
  scanf(" %lf",xmin);
  printf("\nxmax:\t");
  scanf(" %lf",xmax);
  printf("\nymin:\t");
  scanf(" %lf",ymin);
  printf("\nymax:\t");
  scanf(" %lf",ymax);
  printf("\n");
}

在函数main中,不要忘记传递引用:

int main {
  double xmin=0.0,xmax=0.0,ymin=0.0,ymax=0.0;
  set(&xmin, &xmax, &ymin, &ymax);
  ...