該代碼實現一個簡易的 SQL CREATE TABLE 解析器,通過 scanf 逐字段讀取用戶輸入,構建表結構並寫入二進制文件。
// 完整輸入示例
create table student ( // 關鍵字、表名、左括號
id int 4 P N Y , // 字段名、類型、大小、主鍵、非空、可見
name char 20 N N Y , // 逗號表示繼續下一字段
age int 2 N N Y ) // 右括號結束字段列表
into database.dat // 存儲文件名
| 變量 | 含義 | 讀取格式 | 示例 |
|---|---|---|---|
| ctemp_edit[1] | 關鍵字 "table" | %s | table |
| ctemp_edit[2] | 表名 | %15s | student |
| ctemp_edit[3] | 左括號 "(" | %s | ( |
| ctemp_edit[4] | 字段名 | %15s | id |
| ctemp_edit[5] | 類型 | %8s | int |
| size_edit | 大小 | %d | 4 |
| key_edit | 主鍵標記 | %c (跳過空格) | P |
| null_edit | 非空標記 | %c (跳過空格) | N |
| valid_edit | 可見標記 | %c (跳過空格) | Y |
| again | 分隔符 | %c (跳過空格) | , 或 ) |
| ctemp_edit[11] | 關鍵字 "into" | %s | into |
| ctemp_edit[12] | 數據庫文件名 | %s | database.dat |
// 字段循環讀取
do {
scanf("%15s", ctemp_edit[4]); // 字段名
scanf("%8s", ctemp_edit[5]); // 類型
scanf("%d", &size_edit); // 大小
// 讀取三個單字符標記 (跳過空白)
scanf("%c", &key_edit); while(key_edit==' ') scanf("%c", &key_edit);
scanf("%c", &null_edit); while(null_edit==' ') scanf("%c", &null_edit);
scanf("%c", &valid_edit); while(valid_edit==' ') scanf("%c", &valid_edit);
// 構建字段結構並存入數組
strcpy(tempTM.sFieldName, ctemp_edit[4]);
// ... 其他字段賦值
FieldSet[iNum++] = tempTM;
scanf("%c", &again); while(again==' ') scanf("%c", &again);
} while(again == ','); // 逗號繼續,右括號結束
fwrite("~", sizeof(char), 1, fp); // 魔數標記
fwrite(ctemp_edit[2], sizeof(char), FILE_NAME_LENGTH, fp); // 表名
fwrite(&iNum, sizeof(int), 1, fp); // 字段數
fwrite(FieldSet, sizeof(TableMode), iNum, fp); // 字段結構數組
scanf("%c") 會讀取空白字符,必須配合跳過空格循環%c 讀取異常此類交互式解析器是編譯原理、數據庫系統課程的經典實驗項目。