scanf(“%f”,&weight)和scanf(“%f”,weight)如何确定何时添加前缀&

时间:2018-10-16 05:41:20

标签: c

我阅读了以下代码:

//talkback.c -- nosy, informative program
#include <stdio.h>
#include <string.h>  //for strlen() prototype
#define DENSITY 62.4  //human density in lbs per cu ft

int main() {

    float weight, volume;
    int size, letters;
    char name[40];  //name is an array of 40 characters

    printf("Hi! What's your first name?\n");
    scanf("%s", name);
    printf("%s, what's your weight in pounds?\n", name);
    scanf("%f", &weight);
    size  = sizeof name;
    letters = strlen(name);
    volume = weight / DENSITY;
    printf("Well, %s, your volumn is %2.2f cubit feet.\n", name, volume);
    printf("Also, your first name has %d letters, \n", letters);
    printf("and we have %d bytes to store it.\n", size);

}

运行它并输出:

In [13]: !./a.out
Hi! What's your first name?
Hery
Hery, what's your weight in pounds?
100
Well, Hery, your volumn is 1.60 cubit feet.
Also, your first name has 4 letters, 
and we have 40 bytes to store it.

我注意到scanf("%s", name);scanf("%f", &weight);,第二个有一个前缀&前面的重量。

如何区分添加前缀的情况?

4 个答案:

答案 0 :(得分:2)

scanf()代表扫描格式的字符串。现在,在扫描来自标准input stream的输入时,scanf()需要将该输入数据放入某个位置。要存储格式化的input datascanf()需要知道相同数据类型的变量的存储位置。 这就是为什么scanf()需要一个指针(C中的指针存储变量或表达式的存储位置)来存储输入的原因。 address-of operator(&)前面的变量,即&var表示变量'var'的存储位置。

int var;
scanf("%d",&var);

char str[20];
scanf("%s",str);

对于第二个示例,我们不需要address-of运算符,因为 C将数组名称变量视为指针

printf()scanf()的反函数。它将格式化的字符串打印到标准输出。 Printf不需要任何内存位置即可打印输出,它仅需要变量即可获取数据并根据格式说明符对其进行格式化。

printf("%c in ASCII is %d",65,65);

The output will be: A in ASCII is 65

答案 1 :(得分:1)

因为当您接受字符串(即,字符数组)时,不需要在变量名前使用&。这是因为scanf()期望变量的地址。对于普通变量,变量名表示其值,而对于数组,数组名是指向数组第一个元素的指针。因此,当您说weight时,将替换数组中第一个元素的地址,而无需使用&

答案 2 :(得分:1)

我建议从scanf c rerefence开始,并注意输入。例如。 %f表示参数float*的类型-指向float的指针。因此,您只能使用指针,即地址,并且提供地址的方法有几种:

  • 如果只有变量(float a;,则应使用&运算符来输入变量名;
  • 如果您有指针(float * ptr;float arr[10];),则可以使用ptrarr(arr+4)等(所有这些都有)类型float *,以及您可以使用的&arr[4](此处arr[4]的类型为float,而&arr[4]的类型为float *

注意:在float * ptr;中使用scanf之前,指针应使用有效地址初始化,例如ptr = (float*)malloc(sizeof(float));

答案 3 :(得分:1)

一个简单的示例“何时添加前缀&”怎么样?

scanf("%f", ...)期望跟随float *


对于float weightweight不是float *,但是&weightfloat *

float weight;
scanf("%f", &weight);  // & needed

对于float *ppfloat *

float weight;
float *p = &weight
scanf("%f", p);  // no &

提示:确保已启用编译器的所有警告。功能强大的编译器将报告scanf()说明符和参数不匹配。