我阅读了以下代码:
//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);
,第二个有一个前缀&前面的重量。
如何区分添加前缀的情况?
答案 0 :(得分:2)
scanf()
代表扫描格式的字符串。现在,在扫描来自标准input stream
的输入时,scanf()
需要将该输入数据放入某个位置。要存储格式化的input data
,scanf()
需要知道相同数据类型的变量的存储位置。
这就是为什么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];
),则可以使用ptr
或arr
或(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 weight
,weight
不是float *
,但是&weight
是float *
。
float weight;
scanf("%f", &weight); // & needed
对于float *p
,p
是float *
。
float weight;
float *p = &weight
scanf("%f", p); // no &
提示:确保已启用编译器的所有警告。功能强大的编译器将报告scanf()
说明符和参数不匹配。