首页 > 解决方案 > 学习如何在使用 scanf (C) 时正确引用结构字段

问题描述

我做了这个结构

struct dadosPessoais
{
    char nome[60];
    char end[60];
    char cidade[60];
    char estado[3];
    int cep;
};
typedef struct dadosPessoais dadosPessoais

另外,我已经声明了这些变量和指针

dadosPessoais dp[4], *dpp;

我目前正在尝试做的是从用户接收一些数据并使用 *dpp 指针将这些数据存储在 dp[] 变量中。为此,我制作了这个循环结构

for (i = 0; i < 4; i++)
{
    dpp = &dp[i];
    printf("-- Dados da %da pessoa --\n", i + 1);
    printf("Nome: ");
    scanf("%s", dpp->nome);
    getchar();
    printf("Endereço: ");
    scanf("%s", dpp->end);
    getchar();
    printf("Cidade: ");
    scanf("%s", dpp->cidade);
    getchar();
    printf("Estado: ");
    scanf("%s", dpp->estado);
    getchar();
    printf("Cep: ");
    scanf("%d", dpp->cep);
    getchar();
    system("clear");
}

我知道在使用scanf时使用类似的东西dpp->field是不正确的,因为箭头运算符(->)用于通过使用该结构变量的地址返回结构字段值,而不是用于返回结构字段地址本身。但是,如果我尝试使用类似的东西dpp.field仍然不起作用,那么令人困惑的是,因为它应该意味着类似的东西&dp[index].field,对吧?我仍然不知道如何解决这个问题......

标签: carrayspointersdata-structuresstruct

解决方案


Afterdpp = &dp[i];被执行,dpp指向struct dadosPessoais. thendpp->cep指的cep是 that 的成员struct,并且&dpp->cep是那个成员的地址。因此,要将cep成员的地址传递给scanf,传递&dpp->cep

使用scanfwith 时%s,您应该传递数组中第一个字符的地址。所以,对于dpp->nome,你可以通过&dpp->nome[0]

但是,由于nome它是一个数组,当您在表达式中使用它时,它会自动转换为指向其第一个元素的指针。1因此,您可以使用 pass dpp->nometo scanf,它与 pass 相同&dpp->nome[0]

脚注

1sizeof当数组是 的操作数、一元运算&符(获取地址)的操作数或用于初始化数组的字符串文字时,不会发生这种自动转换。特别注意&arrayandarray是指针,但 的类型&array是“指向数组的指针”,而array自动转换后是指向数组元素的指针。


推荐阅读