我有以下多项选择题,我无法弄清楚为什么(A)和(C)不正确,任何解释都将不胜感激!以下问题中唯一正确的答案是(B)。
Which of the following is a correct usage of scanf?
(A) int i=0; scanf("%d", i);
(B) int i=0; int *p=&i; scanf("%d", p);
(C) char *s="1234567"; scanf("%3s", &s);
(D) char c; scanf("%c", c);
答案 0 :(得分:4)
scanf
想要一个正确的地址来存储结果:
(A) int i=0; scanf("%d", i);
i
按值传递,没有地址:错误。
(B) int i=0; int *p=&i; scanf("%d", p);
p
是指向int的指针,scanf
可以在此处存储其结果:右
(C) char *s="1234567"; scanf("%3s", &s);
&s
是指向char *
的指针的地址,你不能在那里存储字符串:错误
(D) char c; scanf("%c", c);
c
按值传递,而不是地址:错误
答案 1 :(得分:2)
您必须传递一个指向该函数的指针,以便它知道存储该值的内存位置。如果您只是按值传递,它会将其视为内存地址,并且所有地狱都会破坏。因此,您使用&
来获取变量的引用(即内存地址)。
A 和 D 错误的原因。
对于 C ,它看起来是正确的,因为你提供了一个指针,但实际上你正在引用那个指针。因此scanf
将覆盖指针本身,而不是它指向的内存。
如果您刚刚提供了s
,那么我们会进入另一个禁区。指针指向字符串文字,您不能修改它。但是,如果它不是文字,而是使用文字作为初始化程序的数组,那么 就可以了,只要你没有读取的数据超过它可以存储的数据:
char s[] = "1234567"; scanf("%3s", s); /* this is okay */
答案 2 :(得分:1)
了解这一点:
int i = 0; scanf("%d",i);
扩展:i变量的地址是什么?对于那个& operator给出i变量的地址。 scanf()获取用户输入并将值存储在该地址上。
char * s =" 1234567&#34 ;; scanf("%3s",& s);
说明:在这种情况下,您将字符串分配给字符指针,并且位于代码部分。此选项的主要目的是我们无法修改代码部分。但在这种情况下,我们正在修改指针。所以在指针指向新分配的地址之后,它可能会输入错误的地址然后得到分段错误。所以我们丢失了以前分配的字符串。
答案 3 :(得分:0)
答案 4 :(得分:0)
scanf
说明符的 %d
将输入作为要扫描的位置的地址。
使用1.您输入的内容为i
,这是错误的
使用2.您输入p
,其地址为i
。这在初始化期间设置为int *p=&i
。所以这是正确的。
使用3.说明符为%s
。这需要输入开始存储字符串的地址。 s
的输入是一个数组,已包含地址。 &s
错了。
使用4.您正在使用%c
的说明符,它也会获取该位置的地址。因此,在这种情况下输入c
是错误的,以获取所需位置的地址&c