day40 SQLite3單詞查詢程序設計與實現

day40 SQLite3單詞查詢程序設計與實現

核心知識點

  • SQLite3 C接口應用:使用sqlite3_opensqlite3_exec等函數操作數據庫
  • 回調函數機制:通過回調函數處理查詢結果集
  • SQL語句構建:動態生成SELECTINSERT等SQL語句
  • 事務處理:使用BEGIN TRANSACTIONCOMMIT提高批量插入效率
  • 結果集處理:理解result數組與查詢列的對應關系
  • 用戶交互設計:實現連續查詢和退出機制

完整代碼實現(帶詳細注釋)

#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// SQLite查詢結果回調函數:用于處理查詢到的結果
// 參數說明:
//   arg:傳遞給回調的用戶數據指針(此處用于傳遞"是否找到"的標志)
//   col:查詢結果的列數(本例中固定為1列)
//   result:查詢結果數據數組(每行結果的值)
//   title:查詢結果的列名數組(本例中為["dict_mean"])
int find(void* arg, int col, char** result, char** title)
{// 將找到結果的標志設為1(表示已找到匹配數據)*(int*)arg = 1;// 打印查詢到的單詞釋義(result[0]對應SELECT指定的dict_mean列)printf("mean:%s\n", result[0]);return 0; // 回調函數返回0表示繼續處理其他結果
}int main(int argc, char** argv)
{sqlite3* db = NULL;         // SQLite數據庫連接句柄char* errmsg = NULL;        // 用于存儲SQL操作錯誤信息int ret = 0;                // 用于存儲函數調用返回值// 打開指定的SQLite數據庫(如果不存在則創建)ret = sqlite3_open("./aaa.db", &db);if (SQLITE_OK != ret){// 打開數據庫失敗,打印錯誤信息fprintf(stderr, " sqlite3_open %s\n", sqlite3_errstr(ret));sqlite3_close(db);      // 關閉數據庫連接return 1;               // 程序異常退出}char sql_cmd[1024] = {0};   // 用于存儲SQL命令字符串// 嘗試刪除已存在的dict表(如果存在) - 清理舊數據strcpy(sql_cmd, "drop table dict");sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);// 注意:刪除失敗可能是表不存在,屬于正常情況// 創建新的dict表,包含id(序號)、word(單詞)、dict_mean(釋義)三個字段bzero(sql_cmd, sizeof(sql_cmd));  // 清空SQL命令緩沖區strcpy(sql_cmd, "create table dict(id int ,word char ,dict_mean text);");ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);if (SQLITE_OK != ret){// 創建表失敗,打印錯誤信息fprintf(stderr, " sqlite3_exec sql_cmd:[%s] %s\n", sql_cmd, errmsg);sqlite3_free(errmsg);   // 釋放錯誤信息內存sqlite3_close(db);      // 關閉數據庫連接return 1;               // 程序異常退出}// 打開單詞詞典文件(路徑為/home/linux/dict.txt)FILE* fp = fopen("/home/linux/dict.txt", "r");if (NULL == fp){perror("fopen");        // 打開文件失敗,打印錯誤信息return 1;               // 程序異常退出}int num = 1;                // 用于記錄單詞的序號(id字段)// 開始數據庫事務(批量插入時使用事務可提高效率)bzero(sql_cmd, sizeof(sql_cmd));strcpy(sql_cmd, "begin transaction;");sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);// 循環讀取詞典文件內容并插入到數據庫中while (1){char linebuf[1024] = {0};   // 用于存儲讀取到的一行數據// 讀取文件中的一行數據,如果讀取失敗(到文件末尾)則退出循環if (NULL == fgets(linebuf, sizeof(linebuf), fp)){break;}// 解析行數據:以空格分割單詞和釋義char* word = strtok(linebuf, " ");    // 獲取單詞部分char* mean = strtok(NULL, "\r");      // 獲取釋義部分(去除回車符)// 構造插入數據的SQL命令bzero(sql_cmd, sizeof(sql_cmd));sprintf(sql_cmd, "insert into dict values(%d,\"%s\",\"%s\");", num++, word, mean);// 執行插入操作ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);if (SQLITE_OK != ret){// 插入失敗,打印錯誤信息fprintf(stderr, " sqlite3_exec sql_cmd:[%s] %s\n", sql_cmd, errmsg);sqlite3_free(errmsg);   // 釋放錯誤信息內存sqlite3_close(db);      // 關閉數據庫連接return 1;               // 程序異常退出}}// 提交事務(將之前的批量插入操作真正寫入數據庫)bzero(sql_cmd, sizeof(sql_cmd));strcpy(sql_cmd, "commit;");sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);// 循環接收用戶輸入,查詢單詞釋義while (1){char want_word[1024] = {0};    // 用于存儲用戶要查詢的單詞printf("input word:");         // 提示用戶輸入單詞fgets(want_word, sizeof(want_word), stdin);  // 讀取用戶輸入want_word[strlen(want_word) - 1] = '\0';     // 去除輸入中的換行符// 如果用戶輸入#quit,則退出查詢循環if (0 == strcmp(want_word, "#quit")){break;}// 構造查詢單詞釋義的SQL命令(僅選擇dict_mean列)bzero(sql_cmd, sizeof(sql_cmd));sprintf(sql_cmd, "select dict_mean from dict where word like  \"%s\"", want_word);int flag = 0;  // 用于標記是否查詢到結果(0:未找到,1:找到)// 執行查詢操作,使用find函數作為結果回調函數ret = sqlite3_exec(db, sql_cmd, find, &flag, &errmsg);if (SQLITE_OK != ret){// 查詢失敗,打印錯誤信息fprintf(stderr, " sqlite3_exec sql_cmd:[%s] %s\n", sql_cmd, errmsg);sqlite3_free(errmsg);   // 釋放錯誤信息內存sqlite3_close(db);      // 關閉數據庫連接return 1;               // 程序異常退出}// 如果未找到匹配的單詞,提示用戶if (0 == flag){printf("cant find %s\n", want_word);}}// 關閉數據庫連接sqlite3_close(db);return 0;   // 程序正常退出
}

關鍵機制解析:result[0]為何精確對應單詞釋義

1. SQL查詢語句的精準投影

sprintf(sql_cmd, "select dict_mean from dict where word like  \"%s\"", want_word);
  • select dict_mean:這是關鍵的"投影"操作,明確指定只返回dict_mean這一列
  • 結果集結構:當查詢命中時,返回的結果集每行只有1列數據
  • 數組索引關系:在回調函數中,result[0]自然對應這唯一一列(即單詞釋義)

2. 數據存儲結構的一致性

sprintf(sql_cmd, "insert into dict values(%d,\"%s\",\"%s\");", num++, word, mean);
  • 插入順序固定:第二列存儲單詞(word),第三列存儲釋義(dict_mean)
  • 查詢匹配:當where word like "%s"條件滿足時,返回的正是第三列存儲的釋義數據

3. 回調函數執行機制

查詢結果情況回調函數調用result數組內容flag
找到1個匹配結果調用1次result[0] = 釋義1
找到N個匹配結果調用N次每次result[0]不同1
無匹配結果不調用-0

重要特性:當查詢無結果時,回調函數不會被調用,因此需通過flag標志判斷是否找到

代碼執行流程與理想結果

初始化階段(首次運行)

$ gcc word_query.c -lsqlite3 -o word_query
$ ./word_query

理想輸出:

input word:hello
mean:你好
input word:world
mean:世界
input word:apple
mean:蘋果
input word:banana
mean:香蕉
input word:#quit

查詢場景模擬

場景1:成功查詢單詞
input word:computer
mean:計算機
  • 執行過程
    1. 構造SQL:select dict_mean from dict where word like "computer"
    2. 數據庫返回匹配行
    3. 觸發回調函數:find()設置flag=1并打印釋義
場景2:未找到單詞
input word:zxy123
cant find zxy123
  • 執行過程
    1. 構造SQL:select dict_mean from dict where word like "zxy123"
    2. 數據庫無匹配結果
    3. 不觸發回調函數
    4. 檢測flag=0,輸出"cant find"提示
場景3:退出程序
input word:#quit
  • 執行過程
    1. 檢測到輸入#quit
    2. 跳出查詢循環
    3. 執行sqlite3_close(db)關閉數據庫
    4. 程序正常退出(返回0)

核心結論

result[0]能精確獲取單詞釋義,是由雙重保障決定的:

  1. SQL投影約束SELECT dict_mean確保結果集僅包含釋義列
  2. 數據存儲一致性:插入時嚴格保證第三列存儲釋義數據

這種設計使回調函數能直接通過result[0]獲取目標數據,無需處理列索引映射問題,是SQLite C接口應用的典型最佳實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98717.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GitHub 熱榜項目 - 日榜(2025-09-08)

GitHub 熱榜項目 - 日榜(2025-09-08) 生成于&#xff1a;2025-09-08 統計摘要 共發現熱門項目&#xff1a;17 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現三大技術趨勢&#xff1a;AI智能體與LLM應用持續爆發&#xff08;emcie-co/parlant、coleam00…

設計模式-工廠方法原型模板方法外觀

設計模式概述 - 工廠方法 & 原型 & 模板方法 & 外觀 工廠方法模式簡述 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它定義了一個用于創建對象的接口&#xff0c;但由子類決定實例化哪個類。工廠方法將類的實例化…

推動檢測認證行業邁向智能化 AITIC一體機發布會在京舉辦

來源&#xff1a;新華社客戶端國家市場監督管理總局認證認可技術研究中心(簡稱“認研中心”)近日聯合技術合作伙伴在北京舉辦AITIC軟硬件一體機發布會。據了解&#xff0c;“AITIC一體機”是專為檢測認證行業設計的智能硬件&#xff0c;提供低成本的本地化部署方案&#xff0c;…

權限即數據:企業系統中的字段級訪問控制架構實戰(β=0.6)

摘要 這篇文章介紹了一個企業系統中的字段權限解析方案&#xff0c;通過規則表與命中記錄表&#xff08;biz_rule_hit&#xff09;聯動&#xff0c;實現對業務數據的動態權限控制。流程包括替換用戶上下文變量、記錄命中規則、查詢業務數據并關聯命中信息&#xff0c;最終在內存…

Python爬蟲實戰:研究Specialty Plots模塊,構建空氣質量監測數據采集和分析系統

1. 引言 1.1 研究背景 隨著全球城市化進程的加速和工業的快速發展,空氣質量問題已成為影響人類健康和生態環境的重要因素。世界衛生組織數據顯示,全球超過 90% 的人口生活在空氣質量超標的環境中,空氣污染每年導致約 700 萬人過早死亡。準確、及時地獲取和分析空氣質量數據…

字典樹算法

一、什么是Trie&#xff1f; Trie&#xff08;發音為"try"&#xff09;&#xff0c;也稱為字典樹、前綴樹&#xff0c;是一種多叉樹結構&#xff0c;專門用于高效存儲和檢索字符串集合。其核心特點是共享字符串的公共前綴&#xff0c;從而大幅減少冗余存儲&#xff0…

Laya使用VideoNode動態加載視頻,可以自定義播放視頻此處以及位置

export class VideoCommand {video: Laya.VideoNode;public duration: number 0;/*** param videoPos 視頻位置* param videoSize 視頻大小*/public constructor(videoPos: Laya.Vector2, videoSize: Laya.Vector2) {this.video new Laya.VideoNode;//添加到舞臺 1是場景中的…

yum localinstall安裝本地包

yum localinstall 是一個用于安裝本地 RPM 包并自動處理依賴關系的命令。當你有一個或多個本地的 RPM 包需要安裝,又希望 yum 能幫你解決可能存在的依賴問題時,這個命令就非常有用。下面我會詳細解釋它的用法和注意事項。 ??? 命令基本用法 yum localinstall 命令的基本…

LeetCode 面試經典 150 題:輪轉數組(三次翻轉法詳解 + 多解法對比)

在數組類算法題中&#xff0c;“輪轉數組” 是一道考察 “原地操作” 與 “邏輯轉換” 能力的經典題目。所謂 “輪轉”&#xff0c;是指將數組元素向右移動指定步數&#xff0c;且超出數組長度的元素需 “循環” 到數組開頭。這道題的最優解 ——三次翻轉法&#xff0c;能以 O …

網絡編程---TCP

1.TCP&#xff1a;傳輸控制協議&#xff0c;位于傳輸層2.TCP的特性&#xff1a;a.使用流式套接字&#xff0c;數據連續&#xff0c;有順序b.TCP是可靠傳輸&#xff0c;有有應答機制ACK&#xff0c;即收到數據后會明確告知發送方已收到數據&#xff1b;若發送方沒有在預計時間收…

對計算機網絡模型的理解

文章目錄 目錄 前言 一、Internet 的核心特點 二、Internet 的組成結構 1. 硬件基礎&#xff1a;網絡運行的 “物理載體” 2. 軟件支撐&#xff1a;網絡運行的 “功能橋梁” 3. 協議規則&#xff1a;網絡運行的 “通用語言” 三、OSI 七層參考模型&#xff08;理論標準&…

每日一算:分發糖果

在算法面試中&#xff0c;“分發糖果” 是一道經典的貪心算法應用題&#xff0c;核心考察對 “局部最優推導全局最優” 的理解。本文將從問題分析出發&#xff0c;提供兩種主流解題思路&#xff0c;并附上 C 實現代碼&#xff0c;幫助你徹底掌握這道題。一、問題重述題目要求有…

【WorkManager】無法在 Direct Boot 模式下初始化

【WorkManager】無法在 Direct Boot 模式下初始化一、問題描述二、問題分析2.1 關于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手動初始化 WorkManager 組件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解決方案一、問題描述 在使用 WorkManager 庫來實現開機上報…

Hybrid應用性能優化實戰分享(本文iOS 與 H5為例,安卓同理)

前言在移動應用開發中&#xff0c;Hybrid 架構因其跨平臺特性和開發效率優勢被廣泛采用。然而&#xff0c;WebView 的性能問題一直是開發者面臨的挑戰。本文將基于實際項目經驗&#xff0c;分享 iOS Hybrid 應用的核心優化策略&#xff0c;涵蓋 WebView 池化、預加載、用戶體驗…

點積、叉積、矩陣行列式詳解、線性相關與線性無關、矩陣的秩、矩陣可逆與不可逆詳解

1.向量 1.1 點積&#xff08;Dot Product&#xff09; 1.1.1 定義 點積是在求一個標量&#xff0c;點積結果沒有方向。 對于兩個向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1?,u2?,u3?),v(v1?,v2?,v3?) 點積定義為&#xff1a;u?vu1v1u…

Mac安裝nvm詳細教程(超簡單)

本章教程,主要介紹如何在Mac操作系統上安裝nvm. 我們使用官方一鍵安裝腳本,完成安裝 一、安裝步驟 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置環境變量,編輯.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到&#xff1f;從$(‘[placeholder“手機號”]’)說起總結&#xff1a;控制臺不騙人&#xff0c;元素選不到&#xff0c;八成是寫法、時機或環境的問題。我們在寫網頁自動化腳本或者調試頁面的時候&#xff0c;經常遇到一個讓人頭疼的問題&#xff1a;明明元素就在…

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們&#xff0c; 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開&#xff0c;也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile&#xff08;本機bash_profile的路徑&#xff09;加入新的環境變量格式如下&#xff08;參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言&#xff0c;用來實現自動和交互式任務進行通信&#xff0c;而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義&#xff1a;Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…