首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言模擬 SQL 建表解析器:交互式輸入流程與字段定義邏輯詳解

     編輯:C 語言問答

程序功能還原

該代碼實現一個簡易的 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"%stable
ctemp_edit[2]表名%15sstudent
ctemp_edit[3]左括號 "("%s(
ctemp_edit[4]字段名%15sid
ctemp_edit[5]類型%8sint
size_edit大小%d4
key_edit主鍵標記%c (跳過空格)P
null_edit非空標記%c (跳過空格)N
valid_edit可見標記%c (跳過空格)Y
again分隔符%c (跳過空格), 或 )
ctemp_edit[11]關鍵字 "into"%sinto
ctemp_edit[12]數據庫文件名%sdatabase.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 讀取異常
  • 結構體對齊導致二進制文件跨平台不兼容
  • 缺乏輸入長度校驗,易發生緩衝區溢出

此類交互式解析器是編譯原理、數據庫系統課程的經典實驗項目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved