朋友你好!
10年積累的網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有淮陰免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
你的程序已經(jīng)給你調(diào)適過了錯誤的地方有注釋
#include "stdafx.h"
#includestdio.h
struct
{
int num;
char name[10];
char sex;
char job;
union
{
int banji;
char position[10];
}category;
}person[2];
void main()
{
int i;
char d;
for(i=0;i2;i++)
{
scanf("%d %s %c %c",person[i].num,person[i].name,person[i].sex,person[i].job);
//"%d %s %c %c"要用空格隔開
if(person[i].job=='s')
scanf("%d",person[i].category.banji);
else if(person[i].job=='t')
scanf("%s",person[i].category.position);
else printf("input error!");
printf("%d %s %c %c",person[i].num,person[i].name,person[i].sex,person[i].job);
}
printf("\n");
printf("No. Name sex job class/position\n");
for(i=0;i2;i++)
{
if(person[i].job=='s')
printf("%-6d%-10s%-3c%-3c%-6d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.banji);//你的程序少些了一個%-3c
else
printf("%-6d%-10s%-3c%-3c%-6s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);//你的程序少些了一個%-3c
}
}
程序已經(jīng)在VC++中測試過了是真確的!
希望對朋友你有幫助!
首先這個是共用體,所以各個變量公用一段內(nèi)存,你s-i[0]=0x39;s-i[1]=0x38;賦值以后,對應(yīng)的該段內(nèi)存最后占8個字節(jié)(兩個int,根據(jù)編譯器來確定)的區(qū)域被賦值,char型占一個字節(jié),你輸出c[0],也就是第一個字節(jié)的數(shù)據(jù)被輸出。而整形數(shù)據(jù)占的4個字節(jié),在存儲時是低位在前的,比如0x11121314.在存儲時會被先讀取0x14放在第一個字節(jié)0x13第二個字節(jié),依次下去,所以0x39相當于在前四個字節(jié)的地址中存為0x39,0x00,0x00,0x00.這樣你讀取第一個字節(jié)的時候就是0x39了。
所謂共用體類型是指將不同的數(shù)據(jù)項組織成一個整體,它們在內(nèi)存中占用同一段存儲單元。其定義形式為:
union 共用體名
{成員表列};
union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了一個共用體數(shù)據(jù)類型union data ,定義了共用體數(shù)據(jù)類型變量obj。共用體數(shù)據(jù)類型與結(jié)構(gòu)體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結(jié)構(gòu)體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結(jié)構(gòu)體類型所占的內(nèi)存空間為其各成員所占存儲空間之和。而形同結(jié)構(gòu)體的共用體類型實際占用存儲空間為其最長的成員所占的存儲空間。
對共用體的成員的引用與結(jié)構(gòu)體成員的引用相同。但由于共用體各成員共用同一段內(nèi)存空間,使用時,根據(jù)需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設(shè)計人員在同一內(nèi)存區(qū)對不同數(shù)據(jù)類型的交替使用,增加靈活性,節(jié)省內(nèi)存。
可以引用共用體變量的成員,其用法與結(jié)構(gòu)體完全相同。若定義共用體類型為:
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。
main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最后一行的輸出是我們無法預(yù)料的。其原因是連續(xù)做mm.d='W';mm.b=34.2;兩個連續(xù)的賦值語句最終使共用體變量的成員mm.b所占四字節(jié)被寫入34.2,而寫入的字符被覆蓋了,輸出的字符變成了符號“ =”。事實上,字符的輸出是無法得知的,由寫入內(nèi)存的數(shù)據(jù)決定。
例子雖然很簡單,但卻說明了共用體變量的正確用法。
結(jié)構(gòu)體(structure)是一種構(gòu)造類型,它是由若干“成員”組成的。每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型,而且每個成員的數(shù)據(jù)類型可以相同也可以不相同。共同體(union)將幾種不同的變量儲存在同一內(nèi)存單元中,也就是使用覆蓋技術(shù),幾個變量互相覆蓋,這種幾個不同的變量共同占用一段內(nèi)存的結(jié)構(gòu),可見二者最大的區(qū)別就是所占用的內(nèi)存,結(jié)構(gòu)體(structure)所占用的內(nèi)存是分量內(nèi)存之和,共同體(union)所占用的內(nèi)存是等于最大的分量的內(nèi)存。
具體來說,結(jié)構(gòu)體(structure)與共同體(union)主要有以下區(qū)別:
1.結(jié)構(gòu)體(structure)與共同體(union)都是由多個不同的數(shù)據(jù)類型成員組成,
但在任何同一時刻,
共同體(union)中只存放了一個被選中的成員,
而結(jié)構(gòu)體(structure)的所有成員都存在。在結(jié)構(gòu)體(structure)中,各成員都占有自己的內(nèi)存空間,它們是同時存在的。一個結(jié)構(gòu)體(structure)變量的總長度等于所有成員長度之和。在共同體(union)中,所有成員不能同時占用它的內(nèi)存空間,它們不能同時存在。共同體(union)變量的長度等于最長的成員的長度。
2.
對于共同體(union)的不同成員賦值,
將會對其它成員重寫,
原來成員的值就不存在了,
而對于結(jié)構(gòu)體(structure)的不同成員賦值是互不影響的。