我試圖使 Struct 中的所有名稱都小寫,以便我可以比較它們并洗掉它們。
int removeNameCard(NameCard *idCard, int *size){
char name[80];
char *ptr;
char rubbish;
int a = 0, c = 0;
printf("removeNameCard():\n");
printf("Enter personName:\n");
scanf("%c", &rubbish); // Why is there a '\n' char here??
fgets(name, 80, stdin);
if((ptr = strchr(name, '\n'))){
*ptr = '\0';
}
if((*size) == 0){
printf("The name card holder is empty\n");
return 0;
}
// Convert everything to Lower Case first
while(name[a]){
name[a] = tolower(name[a]);
a = 1;
}
printf("tolower(): %s", name);
for(int b = 0; b < *size; b = 1){
// Why is this Dot Notation when I passed in a pointer to the Struct?
while (idCard[b].personName)[c]){
(idCard[b].personName)[c] = tolower((idCard[b].personName)[c]);
c = 1;
}
}
for(int i = 0; i < *size; i = 1){
if((idCard[i].personName) == name){
printf("%d. This is from Holder: %s, This is from User: %s", i,(idCard[i].personName),name);
printf("The name card is removed\n");
printf("nameCardID: %d\n", idCard[i].nameCardID);
printf("personName: %s\n", idCard[i].personName);
printf("companyName: %s\n", idCard[i].companyName);
int k = 0;
do{
idCard[i k].nameCardID = idCard[i k 1].nameCardID;
strcpy((idCard[i k].personName),(idCard[i k 1].personName));
strcpy((idCard[i k].companyName),(idCard[i k 1].companyName));
}while((i k 1) != (*size 1));
}
}
return 0;
}
但是,我很困惑為什么編譯器要求我使用點表示法而不是指標表示法,因為我認為我將結構的地址傳遞到 *idCard 中,所以如果我沒有錯,它應該是一個指標?
我是否錯誤地嘗試訪問結構的每個名稱中的每個字符? : (idCard[b].personName)[c]
謝謝
uj5u.com熱心網友回復:
但是,我很困惑為什么編譯器要求我使用點表示法而不是指標表示法......
idCard[i]是一個結構,而不是指向結構的指標,因此它的成員被訪問為,而不是。idCard[i].memberidCard[i]->member
idCard[i]是一個結構,因為每當x是一個指標,x[i]是指向的物件之一x。它不是物件的地址。您可以使用 計算物件的地址x i,然后您可以使用 參考該物件*(x i)。并且x[i]實際上是這樣定義的;x[i]被定義為*(x i)。(在運算式的情況下,一般定義為。)E1[E2](*((E1) (E2)))
我是否錯誤地嘗試訪問結構的每個名稱中的每個字符? : (idCard[b].personName)[c]
這會起作用,但括號是不必要的。您可以使用idCard[b].personName[c]. 由于 C 語法,它已經被分組為(idCard[b].personName)[c].
uj5u.com熱心網友回復:
但是,我很困惑為什么編譯器要求我使用點表示法而不是指標表示法,因為我認為我將結構的地址傳遞到 *idCard 中,所以如果我沒有錯,它應該是一個指標?
陣列大多只是指向陣列中第一個元素的指標(編譯器可能知道陣列大小除外)。
因為陣列大多只是指標;對于整數陣列myInt = myIntArray[x];就像myInt = *(myIntArray x);-指標取消參考由陣列索引隱含。請注意,要訪問陣列中 anchar中間的 a int,您可以(不可移植)使用類似myChar = *((char *)(myIntArray x)) offset_of_char_in_int);; 這有點像訪問結構陣列中的欄位(因為它們都在訪問較大事物陣列中的較小事物)。
對于結構陣列;索引陣列會導致取消參考(就像它對整數陣列所做的那樣);所以myIDcardStruct = idCard[i];就像myIDcardStruct = *(idcard i);。因為陣列索引暗示了取消參考,myIDcardStruct所以不是指標。
在->操作中,就像將偏移所要求的結構的欄位的地址,鑄造地址請求的欄位的型別,然后取消參考。換句話說myInt = myStructPointer->myIntField;就是像myInt = (*myStructPointer).myIntField;哪個像tempAddress = (void *)myStructPointer offset_of_myIntField; myInt = *((int *)tempAddress);。
這意味著,如果您有一個結構陣列(它主要是指向陣列中第一個結構的指標),則對陣列進行索引會導致指標被隱式取消參考,并且使用->也會導致隱式取消參考;如果您同時執行這兩項操作,那么您已經(隱式地)取消參考了一個指標兩次,這是太多的取消參考(因為它不是指向結構指標的指標,也不是指向結構的指標陣列)。因為一旦您必須在一種隱式參考(陣列索引)或另一種隱式參考 ( ->)之間進行選擇,您就只希望取消參考它;例如,您可以在myInt = idCard[i].nameCardID;或之間進行選擇myInt = (idCard i)->nameCardID;。
當然,重要的是使代碼易于閱讀,并且myInt = idCard[i].nameCardID;比myInt = (idCard i)->nameCardID;.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349708.html
