簡體   English   中英

學習如何在使用 scanf (C) 時正確引用結構字段

[英]Learning how to properly reference to a struct field when using 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 .field 的東西,這有什么令人困惑的,對吧? 我仍然不知道如何解決這個問題......

dpp = &dp[i]; 執行時, dpp指向struct dadosPessoais的一個實例。 然后dpp->cep指的是該structcep成員,而&dpp->cep是該成員的地址。 因此,要將cep成員的地址傳遞給scanf ,請傳遞&dpp->cep

scanf%s一起使用時,您應該傳遞數組中第一個字符的地址。 因此,對於dpp->nome ,您可以通過&dpp->nome[0]

但是,由於nome是一個數組,當您在表達式中使用它時,它會自動轉換為指向其第一個元素的指針。 1因此,您可以使用 pass dpp->nomescanf ,它與傳遞&dpp->nome[0]相同。

腳注

1當數組是sizeof的操作數、一元&運算符(獲取地址)的操作數或用於初始化數組的字符串文字時,不會發生這種自動轉換。 特別注意&arrayarray是指針,但是&array的類型是“指向數組的指針”,而array自動轉換后是指向數組元素的指針。

正確的做法應該是 scanf("%s", dpp->nome)。 例子:

#include <stdio.h>

struct test {
     char a[10];
};

int main() {
     struct test new_struct_array[1];
     struct test * ptr = &new_struct_array[0];
     scanf("%s", ptr->a);
     printf("%s", ptr->a);
     return 0;
}

在 C 中,arrays 將指向其第一個元素的 memory 地址。 這就是為什么當你做這樣的事情時:

char nome[10];
scanf("%s", nome);  // works
scanf("%s", &nome); // does not

nome已經是對數組開頭的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM