strstr的while dowhile模型
//int cltClient_rev(void *handle, unsigned char *buf, int *buflen)
//不要相信別人給你傳送的內存地址是可用的
int getCout(char *str, char *substr, int *count)
{
int rv = 0;
char *p = str;
int ncout = 0;
if (str==NULL || substr== NULL || count==NULL)
{
rv = -1;
printf("func getCout()check (str==NULL || substr== NULL || count==NULL) err:%d \n" , rv);
return rv;
}
do
{
p = strstr(p, substr);
if (p == NULL) //沒有找到則跳出來
{
break;
}
else
{
ncout++;
p = p + strlen(substr);
}
} while (*p != '\0');
//fuzhi
*count = ncout;
printf("ncout:%d\n", ncout);
return rv;
}
void main36()
{
char *p = "abcd1111abcd222abcd3333";
int ncout = 0;
while (p = strstr(p, "abcd"))
{
p = p + strlen("abcd");
ncout ++;
if (*p == '\0')
{
break;
}
}
printf("ncout:%d\n", ncout);
system("pause");
}
兩頭堵模型(兩種寫法)
//求去掉空格
//int trimSpaceStr2(char *p, unsigned char *buf2, int *buf2len)
int trimSpaceStr2( char *p, char *buf2)
{
int ret = 0;
int ncount = 0;
int i, j;
i = 0;
j = strlen(p) -1;
while (isspace(p[i]) && p[i] != '\0')
{
i++;
}
while (isspace(p[j]) && j>0 )
{
j--;
}
ncount = j - i + 1;
//
strncpy(buf2, p+i, ncount);
buf2[ncount] = '\0';
return ret;
}
//求去掉空格
//int trimSpaceStr2(char *p, unsigned char *buf2, int *buf2len)
//不要輕易去改變指針輸入特性中in內存塊的內存。。。。
int trimSpaceStr2_notgood( char *p)
{
int ret = 0;
int ncount = 0;
int i, j;
i = 0;
j = strlen(p) -1;
while (isspace(p[i]) && p[i] != '\0')
{
i++;
}
while (isspace(p[j]) && j>0 )
{
j--;
}
ncount = j - i + 1;
//
strncpy(p, p+i, ncount);
p[ncount] = '\0';
return ret;
}
字符串反轉模型
void main51()
{
char p[] = "abcde";
char c ;
char *p1 = p;
char *p2 = p + strlen(p) -1;
while (p1 < p2)
{
c = *p1;
*p1 = *p2;
*p2 = c;
++p1;
--p2;
}
printf("p:%s \n", p);
system("pause");
}
int getKeybyValue(char *pKeyValude, char *pKey, char *pValude)
{
char rv = 0;
char *p = NULL;
if (pKeyValude==NULL )
{
rv = -1;
printf("func getKeybyValue() err:%d pKeyValude \n", rv);
return rv;
}
if ( pKey==NULL )
{
rv = -1;
printf("func getKeybyValue() err:%d pKey=NULL \n", rv);
return rv;
}
if ( pValude==NULL )
{
rv = -1;
printf("func getKeybyValue() err:%d pValude \n", rv);
return rv;
}
//1 在pKeyValude中查找是否有關鍵字pKey
p = strstr(pKeyValude, pKey);
if (p == NULL)
{
rv = -1;
printf("func getKeybyValue() err:%d 查找沒有關鍵字pKey \n", rv);
return rv;
}
p = p + strlen(pKey); //為下一次檢索做准備
//2 有沒有=
p = strstr(p, "=");
if (p == NULL)
{
rv = -2;
printf("func getKeybyValue() err:%d 查找沒有= \n", rv);
return rv;
}
p = p + 1; //為下一次提取valude做准備
//3 提取按照要求的valude
rv = trimSpaceStr03(p, pValude);
if (rv != 0)
{
printf("func trimSpaceStr03() err:%d \n", rv);
return rv;
}
return rv;
}
測試字符串常量和字符數組 類型的變量地址是否相同。
實現此案例需要按照如下步驟進行。
步驟一:字符串地址的測試
代碼如下所示:
上述代碼中,以下代碼:
定義了一個字符型指針str,用於指向一個字符串常量。
上述代碼中,以下代碼:
使用printf函數分別輸出字符串常量的地址和字符數組的地址。從輸出結果可見,它們是不相同的。
本案例的完整代碼如下所示:
定義一個int類型的指針,指向一個整型變量,然後分別使用&和*取得地址或者數據。
實現此案例需要按照如下步驟進行。
步驟一:字符串的定義和使用
代碼如下所示:
上述代碼中,以下代碼:
定義了一個字符數組str,該數組有5個元素。
上述代碼中,以下代碼:
使用scanf函數輸入一個字符串。其中,%4s是限定輸入的字符串中字符的個數不能大於4,否則將只輸入前4個字符。指定值為4是因為字符數組str的長度為5,多出來的一個需要存儲\0。
上述代碼中,以下代碼:
使用函數printf輸出字符串。字符數組所對應的格式控制符是%s。
本案例的完整代碼如下所示:
使用指針實現字符串的函數strlen()、strcat()的功能,可以自定義兩個函數。
實現此案例需要按照如下步驟進行。
步驟一:字符串函數的使用
代碼如下所示:
上述代碼中,以下代碼:
定義了一個函數mystrlen,用於模擬庫函數strlen的功能。該函數的參數為求長度的字符串。在該函數中,以下語句:
首先定義一個整型變量count,用於存儲字符串中字符的個數。在該函數中,以下語句:
設置一個循環,逐個計算字符串中字符的個數,當*str不為\0時,代表該字符串沒有結束。在該函數中,以下語句:
返回字符串的長度。
上述代碼中,以下代碼:
定義了一個函數mystrcat,用於模擬庫函數strcat的功能。該函數的兩個參數為將字符串d連接到字符串s的後面。在該函數中,以下語句:
首先保存被連接字符串的首地址,用於函數結束返回時作返回值用。在該函數中,以下語句:
設置一個循環找到被連接字符串的結束符\0,以便將另一個字符串連接到這個位置。在該函數中,以下語句:
設置一個循環將字符串d的每一個字符拷貝到字符串s的結束字符\0開始的空間中,實現連接功能。在該函數中,以下語句:
返回字符串s的首字符地址。
注意:由於上述循環中,指針s已經發生了變化,所以不能直接返回。
上述代碼中,以下代碼:
首先,在主函數中定義一個字符數組,用於存儲字符串"This is "。
然後,調用自定義函數mystrlen求得字符數組的長度,並輸出。
上述代碼中,以下代碼:
首先,在主函數中定義一個字符指針,用於指向字符串"a string"。
然後,調用自定義函數mystrcat將字符指針指向的字符串拼接到字符數組str中,並輸出。
最後,輸出連接後的字符數組str。
本案例的完整代碼如下所示:
使用指針函數實現文件名和文件目錄的拼接。
實現此案例需要按照如下步驟進行。
步驟一:字符串函數的使用(續1)
代碼如下所示:
上述代碼中,下面代碼行:
定義了一個函數filenamecat,用於拼接文件路徑和文件名的功能。該函數的兩個參數為將文件名字符串name連接到路徑字符串path的後面。在該函數中,以下語句:
首先保存路徑字符串的首地址,用於函數結束返回時作返回值用。在該函數中,以下語句:
設置一個循環找到路徑字符串的結束符\0,以便將文件名字符串連接到這個位置。在該函數中,以下語句:
判斷路徑字符串的最後一個字符是否是/,如果不是則首先在路徑字符串的最後添加字符/。在該函數中,以下語句:
設置一個循環將文件名字符串name的每一個字符拷貝到路徑字符串path的結束字符/後面的空間中,實現連接功能。在該函數中,以下語句:
返回路徑字符串path的首字符地址。
注意:由於上述循環中,指針path已經發生了變化,所以不能直接返回path。
上述代碼中,下面代碼行:
首先,定義一個數組path,用於保存路徑名。
然後,定義一個指針filename,用於指向文件名。
上述代碼中,下面代碼行:
調用自定義函數filenamecat,將文件名filename連接到路徑名path的後面。
上述代碼中,下面代碼行:
使用函數printf輸出連接後的路徑加文件名。
本案例的完整代碼如下所示:
測試不同類型的指針的算術運算。
實現此案例需要按照如下步驟進行。
步驟一:字符串的基本操作
代碼如下所示:
上述代碼中,以下代碼:
使用strcpy函數,將字符串"tarena"賦值到字符數組str中。
上述代碼中,以下代碼:
使用函數strcmp,逐個對比字符串"tarena"與字符數組str中的對應字符。如果所有對應字符均相同則返回0,否則返回非0值。
上述代碼中,以下代碼:
使用函數printf分別打印sizeof(str)和strlen(str)的值。從運行結果可以看出是不相同的。sizeof(str)輸出的是字符數組str中所有元素所占的字節數。strlen(str)輸出的是字符數組str中保存的字符串長度。
上述代碼中,以下代碼:
使用函數strcat在字符串str的最後一個字符的後面連接上字符串" C++方向"。
上述代碼中,以下代碼:
使用函數strtok將剛拼接好的字符串str重新拆分成"tarena"和" C++方向"。
上述代碼中,以下代碼:
首先,使用函數strstr在字符串str中查找子串"re"是否存在,如果存在則返回子串"re"的第一個字符r在字符串str的中的地址。然後,使用函數printf輸出字符r在字符串中的位置。如果不存在,則輸出子串不在字符串中。
上述代碼中,以下代碼:
使用函數sscanf將字符串"a 10 13.5"中的字符a,整數10,雙精度浮點數13.5轉換到字符變量c,整型變量i,雙精度浮點型變量d中。
上述代碼中,以下代碼:
首先,將字符數組str中的所有元素清0。
然後,使用sprintf將字符變量c,整型變量i,雙精度浮點型變量d中的值轉換成字符串,存儲到數組str中。
本案例的完整代碼如下所示:
定義三國五虎上將名單的數組,然後輸入人名,判斷是否是五虎上將。
實現此案例需要按照如下步驟進行。
步驟一:定義五虎上將名單
使用字符指針數組作為名單。
代碼如下:
步驟二:輸入一個名字
定義一個字符數組,用於存儲從控制台輸入的名字。
代碼如下:
步驟三:遍歷數組
遍歷數組,逐個將數組元素與輸入的名字對比,查找是否為五虎上將之一。
注意:strcmp函數需要包含string.h這個頭函數。
本案例的完整代碼如下所示:
測試#include的用法,包括gcc –I指定目錄。
實現此案例需要按照如下步驟進行。
步驟一:#include指令的使用
代碼如下所示:
上述代碼中,以下代碼:
使用#include 指令將文件print.c中的內容添加到本程序的文件中。
上述代碼中,以下代碼:
在主程序中調用print.c中的函數print。
print.c代碼如下所示:
上述代碼中,以下代碼:
使用函數printf輸出提示,該函數被調用了。
本案例的完整代碼如下所示:
print.c代碼如下所示:
測試宏變量的基本用法
實現此案例需要按照如下步驟進行。
步驟一:宏變量的使用
代碼如下所示:
上述代碼中,以下代碼:
定義一個宏變量SIZE,用於定義數組元素的個數。
上述代碼中,以下代碼:
定義一個宏變量BEGIN,用於代替後面的主函數定義。
上述代碼中,以下代碼:
定義一個宏變量END,用於代替後面的主函數返回。
上述代碼中,以下代碼:
定義一個宏變量LOOP,用於代替設置一個循環。
上述代碼中,以下代碼:
在預編譯階段,會被替代為以下語句:
上述代碼中,以下代碼:
在預編譯階段,會被替代為以下語句:
上述代碼中,以下代碼:
在預編譯階段,會被替代為以下語句:
上述代碼中,以下代碼:
在預編譯階段,會被替代為以下語句:
本案例的完整代碼如下所示:
寫一個宏函數,用它來驗證一個日期是否合法。
實現此案例需要按照如下步驟進行。
步驟一:宏函數的定義
上述代碼中,以下代碼:
定義了一個宏函數IS_DATE_VALID,用於測試一個日期是否合法。上述代碼中,\ 代表換行,當宏函數中的字符串比較長時,可以用它來作為換行符,不能用回車,因為回車代表宏函數定義結束。
上述代碼中,以下代碼:
在預編譯階段,會被替代為以下語句:
本案例的完整代碼如下所示:
寫一個頭文件,使用條件編譯實現避免重復include。
實現此案例需要按照如下步驟進行。
步驟一:條件編譯的使用
main.c代碼如下所示:
上述代碼中,以下代碼:
使用#include 指令將文件print.h中的內容添加到本程序的文件中。
print.h文件,代碼如下所示:
上述代碼中,以下代碼:
使用條件編譯指令判斷宏名print_h是否已經定義,如果沒有定義繼續執行下面的語句,否則直接跳到#endif後面的語句執行。
上述代碼中,以下代碼:
如果沒有定義宏名print_h,則執行此語句定義該宏名,這樣下一次再使用#ifndef判斷宏名print_h是否已經定義時,由於已經定義將跳過#endif之間的語句,防止重復include。
print.c文件,代碼如下所示:
上述代碼中,以下代碼:
在main.c函數中已經有此語句,如果沒有條件編譯語句會多次包含print.h文件。
本案例的完整代碼如下所示:
main.c代碼如下所示:
print.h文件,代碼如下所示:
print.c文件,代碼如下所示:
寫一組頭文件,然後按照條件選擇一個進行編譯。
要求:實現避免重復導入並且測試static的作用。
實現此案例需要按照如下步驟進行。
步驟一:short文件
short.h文件,代碼如下所示:
上述代碼中,以下代碼:
為防止重復include而預設的條件編譯指令。
上述代碼中,以下代碼:
聲明短整型的加法add、減法sub運算函數。
short.c文件,代碼如下所示:
上述代碼中,以下代碼:
短整型的加法add函數的定義。
上述代碼中,以下代碼:
短整型的減法sub函數的定義。
步驟二:standard文件
standard.h文件,代碼如下所示:
上述代碼中,以下代碼:
聲明整型的加法add、減法sub運算函數。
standard.c文件,代碼如下所示:
整型的加法add、減法sub運算函數的定義。
步驟三:long文件
long.h文件,代碼如下所示:
上述代碼中,以下代碼:
聲明長整型的加法add、減法sub運算函數。
long.c文件,代碼如下所示:
長整型的加法add、減法sub運算函數的定義。
步驟四:static文件
static.h文件,代碼如下所示:
上述代碼中,以下代碼:
聲明了一個靜態函數。該函數只能在本文件內部使用,在其他的.c文件中無法使用。
上述代碼中,以下代碼:
定義了一個普通函數。
static.c文件,代碼如下所示:
上述代碼中,以下代碼:
定義了一個靜態變量ex,該變量只能在本文件內部使用,在其他的.c文件中無法使用。
上述代碼中,以下代碼:
靜態函數print的定義。
上述代碼中,以下代碼:
普通函數call的定義。由於靜態函數print和靜態變量ex,都與函數call在同一個文件中,所以以下語句:
對靜態函數print的調用和靜態變量ex的使用是合法的。
步驟五:main文件
main.h文件,代碼如下所示:
上述代碼中,以下代碼:
使用條件編譯語句#if判斷宏名SHORT是否定義,如果定義則定義宏名FILE為"short.h"。
上述代碼中,以下代碼:
使用條件編譯語句#elif判斷宏名STANDARD是否定義,如果定義則定義宏名FILE為"standard.h"。
上述代碼中,以下代碼:
使用條件編譯語句#elif判斷宏名LONG是否定義,如果定義則定義宏名FILE為"long.h"。
上述代碼中,以下代碼:
包含頭文件FILE。
main.c文件,代碼如下所示:
上述代碼中,以下代碼:
定義宏名STANDARD,這樣在main.h中將執行#include "standard.h"。
上述代碼中,以下代碼:
聲明一個外部變量ex。變量ex定義在static.c中,但由於變量ex被定義成靜態變量,所以此語句沒有意義。
上述代碼中,以下代碼:
調用的函數add和函數sub是被定義在standard.c中的函數add和函數sub。
上述代碼中,以下代碼:
調用函數print是非法的。因為函數print是靜態函數,只能在static.c文件中被調用。
上述代碼中,以下代碼:
使用變量ex是非法的。因為變量ex是靜態變量,只能在static.c文件中被使用。
上述代碼中,以下代碼:
調用call函數是合法的,因為函數call不是靜態函數。
本案例的完整代碼如下所示:
short.h文件,代碼如下所示:
short.c文件,代碼如下所示:
standard.h文件,代碼如下所示:
standard.c文件,代碼如下所示:
long.h文件,代碼如下所示:
long.c文件,代碼如下所示:
static.h文件,代碼如下所示:
static.c文件,代碼如下所示:
main.h文件,代碼如下所示:
main.c文件,代碼如下所示:
分別使用靜態初始化和動態初始化的方式對數組進行賦值,並循環打印數組元素。
實現此案例需要按照如下步驟進行。
步驟一:input文件
input.h,代碼如下所示:
上述代碼中,以下代碼:
聲明了一個函數input。
input.c,代碼如下所示:
上述代碼中,以下代碼:
聲明了一個外部變量num。該變量定義在main.c中。
上述代碼中,以下代碼:
定義了函數input。
步驟二:output文件
output.h,代碼如下所示:
上述代碼中,以下代碼:
聲明了一個函數output。
output.c,代碼如下所示:
上述代碼中,以下代碼:
聲明了一個外部變量num。該變量定義在main.c中。
上述代碼中,以下代碼:
定義了函數output。
步驟三:main文件
代碼如下所示:
上述代碼中,以下代碼:
定義了一個全局變量num。
上述代碼中,以下代碼:
調用函數input,對變量num進行輸入。
調用函數output,對變量num進行輸出。
步驟四:makefile文件
代碼如下所示:
可以使用makefile文件來一次性執行多條命令(批處理命令)。makefile帶來的好處就是“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
本案例的完整代碼如下所示:
input.h,代碼如下所示:
input.c,代碼如下所示:
output.h,代碼如下所示:
output.c,代碼如下所示:
main文件,代碼如下所示:
makefile文件,代碼如下所示:
定義測試結構體,並進行聲明變量和初始化。
實現此案例需要按照如下步驟進行。
步驟一:結構的聲明和初始化
代碼如下所示:
上述代碼中,以下代碼:
定義學生結構體student。該結構體有兩個成員,第一個成員是學號id,第二個成員是姓名name。在定義結構體student的同時定義了結構體變量stu1。
上述代碼中,以下代碼:
首先,將結構體變量stu1的學號成員賦值為110。
然後,將結構體變量stu1的姓名成員賦值為"zhangsan"。
最後,輸出結構體變量stu1。
上述代碼中,以下代碼:
首先,定義了另一個結構體變量stu2,並對其進行初始化,將學號成員初始化為112,姓名成員初始化為"lisi"。
然後,輸出結構體變量stu2。
本案例的完整代碼如下所示:
定義結構點point,計算每個點離(0,0)的距離。
再定義結構rect(矩形),由兩個點組成,計算矩形的面積。
實現此案例需要按照如下步驟進行。
步驟一:結構的聲明和初始化(續1)
代碼如下所示:
上述代碼中,以下代碼:
定義一個結構體point,該結構體有兩個成員,x軸坐標x,y軸坐標y。
上述代碼中,以下代碼:
定義一個結構體rect,該結構體有兩個成員,左上角點坐標left_top,右下角點坐標right_bottom。
上述代碼中,以下代碼:
定義一個結構體point的變量dot,並初始化為(10,20)。
上述代碼中,以下代碼:
計算點dot到原點的距離。
上述代碼中,以下代碼:
首先,定義兩個結構體point的變量a和b,並初始化為(10,10)和(50,30)。
然後,定義結構體rect的變量r,並用上述兩個結構體point的變量a和b初始化。
上述代碼中,以下代碼:
計算矩形r面積。
本案例的完整代碼如下所示:
定義一個包含月份的名字和這個月天數的結構,用一個結構的數組保存一年中的所有月份和天數,在每個結構中保存一個月的名字和天數。
月份英文:January、February、March、April、May、June、July、August、September、October、November、December。
實現此案例需要按照如下步驟進行。
步驟一:結構的聲明和初始化(續2)
代碼如下所示:
上述代碼中,以下代碼:
定義一個結構體month,該結構體有兩個成員,該月的英文名字和該月的天數。
上述代碼中,以下代碼:
定義了一個結構體month的數組m,該數組有12個元素,每個元素代表一年中的一個月。定義數組m之後,對其進行了初始化。
注意:初始化時,每個數組元素的值用{}括起來。
本案例的完整代碼如下所示:
對比結構做參數的兩種方式,使用->操作成員。
實現此案例需要按照如下步驟進行。
步驟一:結構做參數
代碼如下所示:
上述代碼中,以下代碼:
定義學生結構體student。該結構體有兩個成員,第一個成員是學號id,第二個成員是姓名name。在定義結構體student的同時定義了結構體變量stu。
上述代碼中,以下代碼:
定義了一個函數print1,用於打印結構體student的變量的值。該函數有一個參數,是結構體student的變量stu。這是值傳遞的方法。結構體student的變量stu將是實參的副本。
上述代碼中,以下代碼:
定義了一個函數print2,用於打印結構體student的變量的值。該函數有一個參數,是結構體student的指針變量p。這是地址傳遞的方法。結構體student的指針變量p將指向實參。該函數中,p->id是用指針p指向的結構體student的變量的id成員。
上述代碼中,以下代碼:
首先,將結構體student的變量stu的id成員賦值為110。
然後,將結構體student的變量stu的name成員賦值為"zhangsan"。
上述代碼中,以下代碼:
調用值傳遞方法的print1函數,實參為結構體student的變量stu。
上述代碼中,以下代碼:
調用地址傳遞方法的print2函數,實參為結構體student的變量stu的地址。
本案例的完整代碼如下所示:
測試直接返回結構的問題,並實現用結構指針參數帶出數據。
實現此案例需要按照如下步驟進行。
步驟一:結構做返回值
代碼如下所示:
上述代碼中,以下代碼:
定義學生結構體student。該結構體有兩個成員,第一個成員是學號id,第二個成員是姓名name。
上述代碼中,以下代碼:
定義一個函數input1,用於輸入。該函數中,以下語句:
定義了一個局部結構體student的變量stu。該函數中,以下語句:
輸入學號和姓名。該函數中,以下語句:
返回結構體student的變量stu。
上述代碼中,以下代碼:
定義一個函數input2,用於輸入,該函數有一個參數,是指向結構體student的指針變量p。該函數中,以下語句:
將學號和姓名輸入到結構體student的指針變量p指向的實參。
上述代碼中,以下代碼:
在主函數中,定義結構體student的變量stu,用於接收函數input1的返回值。
上述代碼中,以下代碼:
在主函數中,將結構體student的變量stu的地址作為實參傳入input2,以輸入其值。
本案例的完整代碼如下所示:
對齊是指由於內存分配會將結構中的變量分配到內存的邊界上,以方便訪問。每個成員放的位置是從本身長度的倍數位開始放。
補齊是指整個結構變量的長度要保持內部最長成員(超過4以4計)的倍數。如果不夠,則補齊。
實現此案例需要按照如下步驟進行。
步驟一:結構的對齊和補齊
代碼如下所示:
上述代碼中,以下代碼:
定義一個結構體size,該結構體有兩個成員,字符型變量c和整型變量i。
上述代碼中,以下代碼:
輸出結構體size所占的字節數。從輸出結果可知是8個字節。為什麼不是5個字節呢?
原因是字符對齊的概念。當一個結構體被分配存儲空間時,分配的方法是這樣的:
首先,找到結構體中占字節數最多的成員,本案例中是整型變量i。
然後,以該成員所占的字節數為單位,為結構體的每個成員分配存儲空間。在本案例中,為第一個成員字符型變量c分配4個字節,該成員用掉1個字節,剩下3個字節。字符型變量c所占的那個字節的編號設為0,剩下的3個字節編號依次為1、2、3。
最後,為第二個成員整型變量i分配存儲空間,由於剩下的3個字節的編號依次為1、2、3,用這些編號對整型變量i所占字節數4求余,結果都不為0,所以剩下的3個字節都跳過。而再分配4個字節給整型變量i。
所以本案例的輸出結果為8個字節,而不是5個字節。因為有三個字節沒有用。
本案例的完整代碼如下所示:
聯合就是一塊內存對應不同的類型,並起了不同的名字,在使用時按照名字切換類型,而不是用類型轉換。
實現此案例需要按照如下步驟進行。
步驟一:聯合的基本用法
代碼如下所示:
上述代碼中,以下代碼:
定義了一個聯合data,該聯合中有三個成員,這三個成員共用4個字節。
上述代碼中,以下代碼:
首先,定義一個聯合data的變量d。
然後,將聯合data的變量d的第一個成員a賦值為10。
最後,使用printf輸出聯合data的三個成員的值。從輸出結果可以看出,值都相同。而且,後兩個成員未賦值。原因是聯合data的三個成員共用4個字節。
上述代碼中,以下代碼:
將聯合data的變量d的第二個成員b賦值為20。從輸出結果可以看出,聯合data的三個成員的值都相同。原因是聯合data的三個成員共用4個字節。
上述代碼中,以下代碼:
將聯合data的變量d的第三個成員c賦值為30。從輸出結果可以看出,聯合data的三個成員的值還是都相同。原因還是聯合data的三個成員共用4個字節。
本案例的完整代碼如下所示:
枚舉是一個整型常量的列表,一般來說,值是有限個。每個值都是枚舉常量(整型)。可以定義時指定值,也可以多個枚舉名表示同一個值。枚舉常量可看成字面量。
實現此案例需要按照如下步驟進行。
步驟一:枚舉的基本用法
代碼如下所示:
上述代碼中,以下代碼:
定義了一個枚舉WEEK,是一個整型常量的列表,Monday是1,後面的值依次加1。
上述代碼中,以下代碼:
首先,定義一個整型變量day,用於存儲星期幾的整數。
然後,使用printf提示輸出輸入星期幾。
最後,使用scanf輸入星期幾到整型變量day中。
上述代碼中,以下代碼:
使用switch結構將整形星期幾轉換成字符串的星期幾。其中每個case後面為一個枚舉值。
本案例的完整代碼如下所示: