为什么sscanf需要&对于%d整数而不是%s字符串

时间:2016-07-29 08:30:41

标签: c scanf

我对sscanf例程中的参数感到困惑

#include <string.h>
char sentence[20];
char first_name[7];
char last_name[7];
int age;

strcpy(sentence, "aaaaaa bbbbbb 20");
sscanf(sentence, "%s %s %d", first_name, last_name, &age);

为什么char数组不需要&amp;前缀但整数变量呢?

谢谢

4 个答案:

答案 0 :(得分:3)

C中的字符串是一系列字符,后跟一个&#39; \ 0&#39;字符。 C中数组的名称是初始元素的地址。因此,对于单个整数,您需要添加&#39;&amp;&#39;传递要存储int的地址。

答案 1 :(得分:0)

在C中,数组的名称代表基址 在sscanf()中,您需要传递可以存储变量值的内存位置。所以&表示address of,用于在原始类型的情况下获取地址。这就是&int数据类型一起使用的原因。但是字符串是字符的数组(后跟'\0'),name提供了基址。

答案 2 :(得分:0)

被调用函数中的

&意味着 的地址。

sscanf期望变量的地址,以便它可以将给定字符串的读取值存储到这些地址中(因此也存储在那些变量中)。

C中的数组名称本身是指第一个数组元素的地址,但对于变量,您需要指定变量的地址。

答案 3 :(得分:-1)

在C中,字符数组的标识符被衰减为指向数组第一个元素的指针。

sscanf()函数需要一个指向要写入其中的内存位置的指针,如果你传递int类型,你应该在变量名前加&,这样才能通过变量的地址。这样,sscanf可以直接写入变量的内存位置。您是通过引用传递参数,而不是通过复制。

由于数组名称被衰减为指向数组第一个元素的指针,因此&已经访问了内存位置,因此不需要在其前面添加sscanf