当前位置: 首页 > news >正文

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统

有关sqlite3的基础知识请点击:SQLite3的使用
效果展示:
在这里插入图片描述

创建一个名为contacts.db的数据库

首先,我们需要创建一个名为contacts.db的数据库,并建立一个名为"contact"的表,用于存储联系人信息。该表包含四个列:id、name、phone和email。
以下是创建数据表的SQL语句:

CREATE TABLE IF NOT EXISTS contact (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,phone TEXT,email TEXT
);

代码:

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;} else {fprintf(stdout, "Opened database successfully\n");}/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

实现“添加联系人”功能的代码:

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"
#define STRLEN 50int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *sql_query, name[STRLEN], phone[STRLEN], email[STRLEN];int opt;/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}while(1) {printf("请输入要执行的操作:\n");printf("1. 添加联系人\n");printf("2. 查找联系人\n");printf("3. 更新联系人\n");printf("4. 删除联系人\n");printf("5. 退出程序\n");/*获取用户命令*/while( !scanf("%d", &opt) ) getchar();switch(opt) {case 1:// 添加联系人printf("请输入姓名:\n");scanf("%s", name);getchar();printf("请输入电话号码:\n");scanf("%s", phone);getchar();printf("请输入电子邮件地址:\n");scanf("%s", email);getchar();printf("您输入的姓名是: %s\t电话号码是: %s\n电子邮件是: %s\n", name, phone, email);printf("请输入[y]确认 \n");if('y' != getchar()) {while(getchar() != '\n');printf("添加联系人失败 [已取消]\n");continue;}sql_query = sqlite3_mprintf("INSERT INTO contact ""(name, phone, email) VALUES('%s', '%s', '%s')", name, phone, email);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("添加联系人失败 [%s]\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("添加联系人成功!\n");}sqlite3_free(sql_query);break;	case 2://查找联系人break;case 3://更新联系人break;case 4://删除联系人break;case 5:sqlite3_close(db);return 1;break;default:printf("无效的选项,请重新输入!\n");break;}}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

完整代码

联系人管理系统完整代码

#include <sqlite3.h>
#include <stdio.h>#define DATABASE_NAME "contacts.db"
#define STRLEN 50static int callback(void *NotUsed, int argc, char **argv, char **azColName) {int i;printf("查询结果:\n");for(i = 0; i < argc; i++) {printf("%s: %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main(int argc, char* argv[]) {sqlite3 *db;char *zErrMsg = 0;int rc;/*打开数据库*/rc = sqlite3_open(DATABASE_NAME, &db);if (rc) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}char *sql_query, name[STRLEN], phone[STRLEN], email[STRLEN];int id, opt;/*创建表的SQL语句*/char *sql = "CREATE TABLE IF NOT EXISTS contact (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""phone TEXT,""email TEXT"");";/*执行SQL语句*/rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg); // 创建表if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("Table created successfully\n");}while(1) {printf("请输入要执行的操作:\n");printf("1. 添加联系人\n");printf("2. 查找联系人\n");printf("3. 更新联系人\n");printf("4. 删除联系人\n");printf("5. 退出程序\n");/*获取用户命令*/while( !scanf("%d", &opt) ) getchar();switch(opt) {case 1:// 添加联系人printf("请输入姓名:\n");scanf("%s", name); getchar();printf("请输入电话号码:\n");scanf("%s", phone);getchar();printf("请输入电子邮件地址:\n");scanf("%s", email);getchar();printf("您输入的姓名是: %s\t电话号码是: %s\n电子邮件是: %s\n", name, phone, email);printf("请输入[y]确认 \n");if('y' != getchar()) {while(getchar() != '\n');printf("添加联系人失败 [已取消]\n");continue;}sql_query = sqlite3_mprintf("INSERT INTO contact ""(name, phone, email) VALUES('%s', '%s', '%s')", name, phone, email);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("添加联系人失败 [%s]\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("添加联系人成功!\n");}sqlite3_free(sql_query);break;	case 2://查找联系人printf("请输入要查找的姓名或部分姓名:\n");scanf("%s", name);getchar();sql_query = sqlite3_mprintf("SELECT * FROM contact WHERE name LIKE '%s'", name);rc = sqlite3_exec(db, sql_query, callback, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("查询联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg);}break;case 3:// 更新联系人printf("请输入要更新的联系人ID:\n");while( !scanf("%d", &id) ) getchar();printf("请输入新的姓名:\n");scanf("%s", name);getchar();printf("请输入新的电话号码:\n");scanf("%s", phone);getchar();printf("请输入新的电子邮件地址:\n");scanf("%s", email);getchar();sql_query = sqlite3_mprintf("UPDATE contact SET name='%s', phone='%s', email='%s' WHERE id=%d", name, phone, email, id);rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("更新联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg);} else {printf("更新联系人成功!\n");}break;case 4:// 删除联系人printf("请输入要删除的联系人ID:\n");while( !scanf("%d", &opt) ) getchar();sql_query = sqlite3_mprintf("DELETE FROM contact WHERE id=%d", id); // sqlite3_mprintf函数会自动申请内存空间,rc = sqlite3_exec(db, sql_query, NULL, NULL, &zErrMsg);if(rc != SQLITE_OK) {printf("删除联系人失败: %s\n", zErrMsg);sqlite3_free(zErrMsg); // 释放内存空间} else {printf("删除成功!\n");}break;case 5:sqlite3_close(db);return 1;break;default:printf("无效的选项,请重新输入!\n");break;}}/*关闭数据库文件*/sqlite3_close(db);return 0;
}

上述代码实现了一个简单的联系人管理系统,可以通过命令行进行添加、查找、更新和删除操作。其中,使用sqlite3_mprintf()函数来创建SQL查询语句。
在程序开始时,会提示用户输入要执行的操作,并根据用户输入的选项来执行相应的操作。每个操作都有相应的提示信息和输入要求,例如添加联系人需要输入姓名、电话号码和电子邮件地址等信息。
在查询联系人时,我们使用回调函数callback()来处理查询结果并将输出内容改为中文。对于其他操作,我们只需检查SQL查询是否成功并处理相应的错误消息即可。
需要注意的是,在实际开发中,还需要对输入进行合法性验证以及防止SQL注入攻击等安全问题。

相关文章:

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击&#xff1a;SQLite3的使用 效果展示&#xff1a; 创建一个名为contacts.db的数据库 首先&#xff0c;我们需要创建一个名为contacts.db的数据库&#xff0c;并建立一个名为"contact"的表&#xff0…...

秋招Java后端开发冲刺——并发篇2(JMM与锁机制)

本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述&#xff0c;包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMM&#xff08;Java内存模型&#xff09; 1. 介绍 JMM定义了共享内存中多线程程序读写操作的行为规…...

记录一次Chrome浏览器自动排序ajax请求的JSON数据问题

文章目录 1.前言2. 为什么会这样&#xff1f;3.如何解决&#xff1f; 1.前言 作者作为新人入职的第一天&#xff0c;mentor给了一个维护公司运营平台的小需求&#xff0c;具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。 第一步&#xff1a; myb…...

【嵌入式——FreeRTOS】任务

【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除 动态方式创建任务 任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由freeRTOS从freeRTOS管理的堆中…...

网关,路由器,交换机

一、网关 (Gateway) 是一种设备&#xff0c;用于连接不同网络&#xff0c;能够转发数据包并翻译协议&#xff0c;允许不同类型的网络通信。网关通常工作在OSI模型的应用层或传输层&#xff0c;提供连接和路由服务。 应用场景例子&#xff1a; 在企业网络中&#xff0c;网关可…...

sublime 3 背景和字体颜色修改

sublime 4 突然抽风&#xff0c;每次打开都显示 “plugin_host-3.3 has exited unexpectedly, some plugin functionality won’t be available until Sublime Text has been restarted” 一直没调好&#xff0c;所以我退回到sublime 3了。下载好了软件没问题&#xff0c;但是一…...

leetcode 403周赛 包含所有1的最小矩形面积||「暴力」

3197. 包含所有 1 的最小矩形面积 II 题目描述&#xff1a; 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形&#xff0c;并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意…...

Stable Diffusion web UI 插件

2024.7.3更新&#xff0c;持续更新中 如果需要在linux上自己安装sd&#xff0c;参考&#xff1a;stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下&#xff0c;然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同&#xf…...

深度学习中的反向传播算法的原理

深度学习中的反向传播算法的原理&#xff0c;以及如何计算梯度 反向传播算法&#xff08;Backpropagation&#xff09;是深度学习中最核心的优化技术之一&#xff0c;用于训练神经网络。它基于链式法则&#xff0c;通过从输出层逆向计算误差并逐层传递到输入层来更新模型参数&…...

身处奇瑞看三星:既“开卷“又“起火“,却更难受了

三星"起火" 这几天奇瑞的事情&#xff0c;让大家破防了&#xff0c;纷纷表示国内的就业市场环境普遍恶劣。 那我们转个眼&#xff0c;看看海外企业的情况。 最近一周&#xff0c;三星频频登上新闻&#xff0c;颇有"起火"之势。 在刚步入下半年的 7 月 1 日…...

系统架构设计师教程(清华第2版)<第1章 绪论>解读

系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…...

Vue + Element UI + JSEncrypt实现简单登录页面

安装依赖 npm install jsencrypt --save局部引入 import JSEncrypt from jsencrypt/bin/jsencrypt;登录页面index.vue <template><div class"loginbody"><div class"logindata"><div class"logintext"><h2>Wel…...

从“关注流”到“时间线”,搜狐给内容加信任价值

文 | 螳螂观察 作者 | 易不二 在近日第十六季搜狐新闻马拉松活动中&#xff0c;搜狐新闻APP的“时间线”功能备受瞩目。不仅开幕式现场竖了一块“左手时间线&#xff0c;右手关注流”的路牌&#xff0c;张朝阳也着重强调了“时间线”产品的互动方式&#xff1a;“关注是基础&…...

vscode的一些使用问题

vscode使用技巧 1、快捷键&#xff08;1&#xff09;打开命令面板&#xff08;2&#xff09;注释&#xff08;3&#xff09;删除行&#xff08;4&#xff09;上下移动光标&#xff08;5&#xff09;光标回退&#xff08;6&#xff09;复制行&#xff08;7&#xff09;插入空白行…...

爬虫-网页基础

HTML 基本语法 HTML&#xff1a;Hyper Text Markup Language, 超文本标记语言&#xff0c;是计算机语言的一种&#xff0c;由元素构成。 p元素 <p>Web 真好玩&#xff01;</p> 由三大部分组成 开始标签&#xff1a;一对尖括号中间包裹这元素名称元素内容&#x…...

保存huggingface缓存中AI模型(从本地加载AI模型数据)

在github下拉项目后,首次运行时会下拉一堆模型数据&#xff0c;默认是保存在缓存的&#xff0c;如果你的系统盘空间快满的时候就会被系统清理掉&#xff0c;每次运行又重新下拉一次&#xff0c;特别麻烦。 默认下载的缓存路径如下&#xff1a;C:\Users\用户名\.cache\huggingf…...

wps的xlsm和xltm和xlam格式的文件各有什么区别

文章目录 一、前言二、WPS表格文件格式介绍1. .xlsm 文件格式2. .xltm 文件格式3. .xlam 文件格式 三、总结 一、前言 本文将详细介绍WPS表格中三种常见的文件格式&#xff1a;.xlsm、.xltm、和.xlam&#xff0c;并提供通俗易懂的解释和示例&#xff0c;帮助用户理解它们的区别…...

软件性能测试有哪几种测试方法?专业性能测试报告出具

软件性能测试是指对软件系统在特定负载条件下的性能进行评估和验证的过程&#xff0c;目的是确保软件在正常使用的情况下能够满足用户的要求&#xff0c;并在稳定的性能水平下运行&#xff0c;在软件开发过程中起到了至关重要的作用&#xff0c;可以确保软件产品的质量和可靠性…...

JavaScript语言简介与实战应用:从零开始的编程之旅

JavaScript&#xff0c;一种轻量级的、解释型的、面向对象的脚本语言&#xff0c;自1995年由Netscape公司的Brendan Eich设计以来&#xff0c;迅速成为了Web开发中不可或缺的一部分。它不仅能够为静态网页添加动态效果&#xff0c;还能实现客户端与服务器的交互&#xff0c;如今…...

如何理解synchronized锁升级

在Java中&#xff0c;synchronized 关键字是实现线程同步的一种方式&#xff0c;它涉及到锁的升级和释放的过程。理解synchronized 锁的升级可以分为三个阶段&#xff1a;无锁状态、偏向锁状态和轻量级锁状态。 无锁状态&#xff1a; 当对象被创建时&#xff0c;默认处于无锁状…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...