[英]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
指的是該struct
的cep
成員,而&dpp->cep
是該成員的地址。 因此,要將cep
成員的地址傳遞給scanf
,請傳遞&dpp->cep
。
將scanf
與%s
一起使用時,您應該傳遞數組中第一個字符的地址。 因此,對於dpp->nome
,您可以通過&dpp->nome[0]
。
但是,由於nome
是一個數組,當您在表達式中使用它時,它會自動轉換為指向其第一個元素的指針。 1因此,您可以使用 pass dpp->nome
到scanf
,它與傳遞&dpp->nome[0]
相同。
1當數組是sizeof
的操作數、一元&
運算符(獲取地址)的操作數或用於初始化數組的字符串文字時,不會發生這種自動轉換。 特別注意&array
和array
是指針,但是&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.