❶ c語言中如何實現對結構體的查找以及輸出
C語言的結構體是一組數據的組合,並不是簡單的單一類型。所以在查找和輸出的時候,均不能直接操作,而是要進行變通。
1 查找。
對於以某一項為關鍵字進行查找時,比如在結構體中有int型的成員a,要查找a為100的結構體變數,這時需要遍歷每個結構體(數組、鏈表、或者其它任意形式),對每個元素的成員a值進行比較,符合的則表示查找成功。
對於結構體中元素較多,同時要對整個結構體每個元素都匹配才算查找到的特殊情況,可以使用memcmp的方式,整體進行比較,以減少代碼量。不過這種情況較為少見,不過多描述。
2 輸出。
對於結構體的輸出,其實就是對其每一項,或者若干項成員變數的輸出。
所以可以使用基本的輸出函數,對每一項單獨輸出,輸出中為了方便閱讀,可以加一些說明文字。
如果對結構體輸出有多處調用的需求,可以在將該功能封裝為函數,供各個需要的函數調用。這樣的好處是,當結構體的成員出現變化,或者結構體輸出要求更改時,修改一處代碼即可完成所有的輸出修改,實現易於維護的效果。
❷ c語言結構體數組的輸入輸出
C
語言中,結構體(struct)是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。
結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
定義與聲明
結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。
在實際應用中,C語言結構體數組常被用來表示一個擁有相同數據結構的群體,比如一個班的學生、一個車間的職工等。
在C語言中,定義結構體數組和定義結構體變數的方式類似;
例:
struct stu{
char*name;//姓名
int num;//學號
int age;//年齡
char group;//所在小組
float score;//成績
}class[5];
表示一個班級有5個學生。
(2)c語言輸出一個結構體擴展閱讀:
結構體數組的引用與引用一個結構體變數在原理上是一樣的。只不過結構體數組中有多個結構體變數,我們只需利用for循環一個一個地使用結構體數組中的元素。
下面編寫一個程序,編程要求:從鍵盤輸入5個學生的基本信息,如姓名、年齡、性別、學號,然後將學號最大的學生的基本信息輸出到屏幕。
#include<stdio.h>
#include<string.h>
struct STU
{
char name[20];
int age;
char sex;
char num[20];
};
void OutputSTU(struct STU stu[5]);
//函數聲明,該函數的功能是輸出學號最大的學生信息
int main(void)
{
int i;
struct STU stu[5];
for(i=0;i<5;++i)
{
printf("請輸入第%d個學生的信息:",i+1);
scanf("%s%d%c%s",
stu<i>.name,
&stu<i>
.age,&stu<i>
.sex,stu<
i>.num);/*%c
前面要加空格,不然輸入時會將空格賦給%c*/
}
OutputSTU(stu);
return 0;
}
void OutputSTU(struct STU stu[5])
{
struct STU stumax=stu[0];
int j;
for(j=1;j<5;++j)
{
if(strcmp(stumax.num,stu[j]
.num)<0)//strcmp函數的使用
{
stumax=stu[j];
}
}
printf("學生姓名:%s學生年齡:%d學生性別:%c學生學號:
%s ",stumax.name,
stumax.age,stumax.
sex,stumax.num);
}
輸出結果是:
請輸入第1個學生的信息:小紅22 F Z1207031
請輸入第2個學生的信息:小明21 M Z1207035
請輸入第3個學生的信息:小七23 F Z1207022
請輸入第4個學生的信息:小欣20 F Z1207015
請輸入第5個學生的信息:小天19 M Z1207024
學生姓名:小明學生年齡:21學生性別:M學生學號:Z1207035
❸ c語言結構體輸入及輸出問題
gets(stu[i].name);這句前面加上getchar();
因為gets函數會接受來自上一次輸入遺留的回車符從而直接結束函數
還有你的
printf("\nthe
number
is:%d\n",stu[0].score);
是不是應該改成
printf("\nthe
number
is:%d\n",stu[i].score);
❹ c語言的一個結構體
是位域
即:一個16位的無符號整數,其中:
correctIndex 佔2位
burst_count 佔2位
redWhichNumber 佔2位
blueWhichNumber 佔2位
burst_moment 佔1位
exitidle 佔1位
status 佔4位
null 佔2位
相關知識:
有些信息在存儲時,並不需要佔用一個完整的位元組, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變數,共占兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a占第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變數名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上常式序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變數bit和指向bs類型的指針變數pbit。這表示位域也是可以使用指針的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指針變數pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"|=", 相當於: pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。
❺ 關於C語言結構體輸出的問題
把結構體中的soccer數組改成 double 就行了
double soccer[3];
float在c、c++中會經常出現類似的錯誤
所以我一般用double
----
strcpy(stu.name,"Li Li");stu.name是字元串首地址(指針)
你去看MSDN中的strcpy參數說明就知道了
------
那是C語言的規定啊,就想引用一樣,要使用引用就必須要在生命的時候賦值。畢竟字元數組和字元串是有區別的。
❻ c語言中 輸出單向鏈表中的一個結構體的內容
你的描述讓我看不懂。我默認為你要問的是:給出鏈表的頭指針,輸出鏈表中某個結構體(結點)的內容。
下面是偽代碼:
voidprint(Node *head){
if(head==null) return;
if(head 是要輸出的結點)
輸出head指向的結點的內容;
else
print(head->next);
}
❼ C語言一個簡單的結構體輸出不知道哪裡錯了!
這是改好的
#include<stdio.h>
intmain(void)
{
structstudent
{
intnum;
charname[100];
charsex;
charadr[100];
}student1={10010,"sanpao",'m',"kaixinguo"};
printf("NO.=%d name=%s sex=%c adr=%s ",
student1.num,student1.name,student1.sex,student1.adr);
return0;
}
❽ C語言結構體輸出
structbeixuanzhe
{
charname[20];
intxuanpiao;
}sb1={"sb1",0},sb2={"sb2",0},sb3={"sb3",0};
假如這是定義的結構體那麼輸出如下
printf("name=%s,xuanpiao=%d ",sb1.name,sb1.xuanpiao);
printf("name=%s,xuanpiao=%d ",sb2.name,sb2.xuanpiao);
printf("name=%s,xuanpiao=%d ",sb3.name,sb3.xuanpiao);
❾ C語言關於結構體的輸入輸出
void input(struct book* p)
{
//scanf("%d,%s,%d,%d",&p->a,p->num,&p->pub.year,&p->pub.month);
//這里 char num[9];數組,按字元串輸入 %s不能以逗號分隔,函數無法識別輸入結束!
//改成:
scanf("%d %s %d %d",&p->a,p->num,&p->pub.year,&p->pub.month);
//輸入以空格分格就可以了!
}
❿ C語言,結構體定義的輸入輸出函數
結構體的輸入輸出與一般的一樣,但是不能整體對結構體進行輸入輸出,只能對其成員分個輸入輸出,比如結構體struct
student{
int
number;
char
name[20]}..................輸入學號可以用scanf("%d",&number);輸入姓名scanf("%s",name);........................當然,你也可以使用gets();之類的,只要記住對其成員輸入輸出就行,純手打,滿意請採納,謝謝O(∩_∩)O~