使用floatf变量printf()和scanf()有几种方法?

时间:2019-06-04 13:59:08

标签: c

我正在为毕业考试做准备,我对c编程语言有一些疑问。我将结合其中两个我有答案的问题,但我并不真正理解它们。第一个问题是选择输出数组第i个元素的值的正确表达式,这是可能的答案: (请注意,两个问题的代码都相同)

  1. printf("%f",B[i]);
  2. printf("%f",&B[i]);
  3. printf("%f",B+i);
  4. printf("%p",*(B+i));
  5. printf("%f",*(B+i));

第二个问题是选择输入数组第i个元素值的正确表达式

  1. scanf("%f", B[i]);
  2. scanf("%f", B+i);
  3. scanf("%p", B+i);
  4. scanf("%f", &B[i]);
  5. scanf("%f", *(B+i));

我试图编译并运行一个模拟这些问题的程序。 scanf部分适用于答案2-5,除第4个(当然在输入之后)之外,所有printfs都输出零。

float *B;
int n;
B=calloc(n,sizeof(float));

2 个答案:

答案 0 :(得分:9)

您对正确答案的理解存在缺陷。

要使用float打印类型为printf的值,您需要使用%f格式说明符并传递类型为float的值。要通过float读取类型为scanf的值,还可以使用%f格式说明符,但要传递类型为float *的值。

关于数组索引,符号A[N]完全等同于*(A + N)并具有数组元素的类型,而&A[N]完全等同于A + N并具有类型指向数组元素的指针。

基于此,我们有以下内容:

printf("%f",B[i]);    // Correct
printf("%f",&B[i]);   // Incorrect, passing a float *, expected float
printf("%f",B+i);     // Incorrect, passing a float *, expected float (same as prior)
printf("%p",*(B+i));  // Incorrect, %p is used to print a pointer (expects a void *)
printf("%f",*(B+i));  // Correct

scanf("%f", B[i]);    // Incorrect, passing a float, expected float *
scanf("%f", B+i);     // Correct
scanf("%p", B+i);     // Incorrect, %p is used to read a pointer (expects a void *)
scanf("%f", &B[i]);   // Correct
scanf("%f", *(B+i));  // Incorrect, passing a float, expected a float *

答案 1 :(得分:1)

float

有两种printf浮点数和scanf浮点数的方法。

printf("%f",  my_float);
printf("%lf", my_float); // works fine but bad style

scanf("%f",  &my_float);

(在最古老的C标准中,printf不允许%lf


float*

printf指针本身有一种方法:

printf("%p", ptr);

scanf读取指针没有意义,但是您可以读取指针ptr所指向的内存,如下所示:

scanf("%f",  ptr); // no & needed, it is already a pointer

您的示例中的所有内容都没有多大意义。打印地址不打印float。在指针上使用各种形式的算术,例如&B[i]*(B+i)与打印无关。