如何printf()在一行中輸出結構內成員的第一個和第二個位元組?
//example
int aNum=513;
int main(){
printf("\n i i",((char*)&aNum)[0],((char*)&aNum)[1]); // --> 01 02
}
如何在結構的成員中執行與上述相同的操作?
struct test {
int aNum;
};
int main(){
struct test * r;
r->aNum=513;
printf("\n i i",??,??);
}
uj5u.com熱心網友回復:
在列印結構的成員之前,您需要有一個結構。struct test * r;不提供結構;它提供了一個指向結構的指標。
您可以使用它struct test s;來創建結構。如果要使用指向它的指標,則可以使用struct test *r = &s;. 然后r->aNum=513;將在其中存盤一個值。
該結構的成員是s.aNumor r->aNum。該成員的地址是&s.aNum或&r->aNum。
(unsigned char *) &s.aNum您可以使用 cast:或將該成員的地址轉換為其第一個位元組的地址(記憶體中的相同位置但 C 語意中的不同型別)(unsigned char *) &r->aNum。請注意,您通常應該使用unsigned char而不是在處理對物件進行編碼的位元組時,以避免在已簽名char的情況下產生不良影響。char
給定 an 的地址unsigned char,您可以使用陣列下標從該地址訪問 0 或 1 個位元組的位元組,因此((unsigned char *) &s.aNum)[0]or((unsigned char *) &r->aNum)[0]用于初始位元組或((unsigned char *) &s.aNum)[1]or((unsigned char *) &r->aNum)[1]用于下一個位元組。
您printf應該使用超過2欄位寬度,因為位元組可以超過兩位十進制數字。(通常在檢查原始位元組時,我們使用十六進制而不是十進制。)
您可以使用以下命令列印兩個位元組:
printf("i i\n", ((unsigned char *) &r->aNum)[0], ((unsigned char *) &r->aNum)[1]);
您應該更喜歡將換行符放在行尾,而不是開頭。C 的流就是為此而設計的;當遇到換行符時,行緩沖流將向設備發送資料。因此,將其放在一行的末尾可確保立即發送該行。如果它在開頭,并且結尾沒有換行,則該行可能不會被發送到輸出設備,直到程式執行其他操作。
要以十六進制列印,請使用:
printf("hhx hhx\n", ((unsigned char *) &r->aNum)[0], ((unsigned char *) &r->aNum)[1]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415839.html
標籤:
上一篇:使用欄位元素初始化指向結構的指標
