Struct是在C中非常好用寫法,筆者稱之為"自訂的一種多元資料型態"
為什麼這麼形容呢?
請先看看以下範例:
typedef struct{int a[10];char b[10;]}example_info;
在以上的範例中,我們定義一個資料型態"example_info"
其中包含一個整數(int)陣列a和一個字元(char)陣列b
這樣在使用時就可以直接呼叫,用法如下:
#include<stdio.h>
typedef struct{int a[10];char b[10;]}example_info;
int main()
{
example_info ex;/*請注意,因為是資料型態,所以使用前也需定義變數*/
int p[10];char q[10];/*另外定義本範例所要使用的變數*/
for(int i=0;i<10;i++)
{
q[i]=ex.b[i];
}
}
return 0;
}
以上範例雖然沒有任何意義,但經過程序
q陣列的值就可以被"ex"中b的值所取代,這就是Struct的基本用法
看到這裡,有人可能會想說:「用這要幹麻? 分開定義不就好了?」
沒錯,在上述範例下,分開定義也可以行的通
但這麼做比較有系統,程式碼本身也較容易被暸解
至於應用方法,以下將做說明
----------------------------------------------------------------------------------------------------------
相信各位都知道,"副函式"是由程式設計師應程式本身需要
而寫出的函式,但這種寫函式的方法只能回傳"一個"值
當然也有別的方法,例如設定不回傳(void)後再用指標(point)
不過,今天我們所要談的是另一種方法
首先,借用上述程式碼,我們可以將副函式格式設定成如下方式:
exmple_info 副函式名稱(輸入值)
如此一來就可以經由一個return傳回一組資料
這是筆者認為最實用的部份
以下為實用範例:
/*本程式可利用檔案輸入個人資料(姓名+IP),並將同一網域的使用者列印出來*/
#include<stdio.h>
#include<stdlib.h>
typedef struct{int ip[4];char name[11];} address_t;/*定義資料型態*/
void print_address(address_t,address_t);
address_t scan_address(FILE *);
int local_address(address_t,address_t);
int main()
{
FILE *infilep;
int i=0,j=0,k=0;
infilep=fopen("in.txt","r");
address_t data[100];
do
{
data[i]=scan_address(infilep);
i++;
}
while(data[i-1].ip[0]!=0,data[i-1].ip[1]!=0);
i--;
for(j=0;j<i;j++)
{
for(k=j+1;k<i;k++)
{
if((local_address(data[j],data[k])==1)&&(j!=k))
{
print_address(data[j],data[k]);
}
}
}
#include<stdlib.h>
typedef struct{int ip[4];char name[11];} address_t;/*定義資料型態*/
void print_address(address_t,address_t);
address_t scan_address(FILE *);
int local_address(address_t,address_t);
int main()
{
FILE *infilep;
int i=0,j=0,k=0;
infilep=fopen("in.txt","r");
address_t data[100];
do
{
data[i]=scan_address(infilep);
i++;
}
while(data[i-1].ip[0]!=0,data[i-1].ip[1]!=0);
i--;
for(j=0;j<i;j++)
{
for(k=j+1;k<i;k++)
{
if((local_address(data[j],data[k])==1)&&(j!=k))
{
print_address(data[j],data[k]);
}
}
}
fclose(infilep);
return 0;
}
address_t scan_address(FILE *infilep)/*此副函式可利用struct回傳一組data*/
{
address_t data;
char ch;
fscanf(infilep,"%d%c%d%c%d%c%d%s",&data.ip[0],&ch,&data.ip[1],&ch,&data.ip[2],&ch,&data.ip[3],&data.name);
return data;
}
void print_address(address_t a,address_t b)
{
printf("Machines %s and %s are on the same local network\n",a.name,b.name);
}
int local_address(address_t a,address_t b)
{
if((a.ip[0]==b.ip[0])&&(a.ip[1]==b.ip[1])) return 1;
else return 0;
}
return 0;
}
address_t scan_address(FILE *infilep)/*此副函式可利用struct回傳一組data*/
{
address_t data;
char ch;
fscanf(infilep,"%d%c%d%c%d%c%d%s",&data.ip[0],&ch,&data.ip[1],&ch,&data.ip[2],&ch,&data.ip[3],&data.name);
return data;
}
void print_address(address_t a,address_t b)
{
printf("Machines %s and %s are on the same local network\n",a.name,b.name);
}
int local_address(address_t a,address_t b)
{
if((a.ip[0]==b.ip[0])&&(a.ip[1]==b.ip[1])) return 1;
else return 0;
}
全站熱搜
留言列表