【C语言】简易英语词典
文章目录
- 一、定义英语单词信息的结构体
- 二、主函数功能逻辑
- 三、查单词函数
- 四、背单词函数
- 五、补充
一、定义英语单词信息的结构体
添加必要的头文件、宏定义和声明,之后定义英语单词信息结构体。
/* 头文件和宏定义 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>/* 单词最大长度 和 单词定义最大长度 */
#define MAX_WORD_LENGTH 20
#define MAX_DEFINITION_LENGTH 200/* 英语单词结构体定义 */
struct EnglishWord
{char word[MAX_WORD_LENGTH]; // 单词拼写char definition[MAX_DEFINITION_LENGTH]; // 单词定义
};/* 函数声明 */
void searchWord(const char *filename);
void memorizeWord(const char *filename);
可以更改结构体的信息,以此来添加新功能。
添加另一个定义,之后可以收藏单词,查看收藏单词列表…
/* 结构体定义表示一个英文单词1、单词是否收藏2、单词拼写3、单词定义
*/
struct EnglishWord
{int isFavorite;char word[MAX_WORD_LENGTH];char definition[MAX_DEFINITION_LENGTH];
};
二、主函数功能逻辑
包含一个主循环,该循环持续显示菜单并等待用户输入。根据用户的选择,程序将执行相应的操作,如查单词、背单词或退出系统。在选择查询单词时,程序还包含一个嵌套循环,允许用户连续查询单词直到选择退出。程序会持续运行,直到用户选择退出系统。
/* 主函数*/
int main()
{// 定义int choice;while (1){printf("--------英语单词词典--------\n");printf("\t1. 查单词\n");printf("\t2、背单词\n");printf("\t0. 退出系统\n");printf("请选择操作:");scanf("%d", &choice);switch (choice){case 1:/* 连续查询 */while (1){char ch;searchWord("English.txt");printf("继续搜索单词(y/n): ");scanf(" %c", &ch); // 在%c前添加一个空格以跳过可能的空白字符while (getchar() != '\n');if (ch == 'n'){break;}}break;case 2:memorizeWord("English.txt");break;case 0:printf("成功退出系统。");exit(0);break;default:printf("无效选择,请重新输入!");}}return 0;
}
- 主循环: 主函数采用了一个无限循环
while (1),使得用户可以在执行完一次操作后选择继续进行其他操作或退出系统。 - 菜单显示和选择: 主循环内部通过
printf显示简单的菜单,包括查单词、背单词、退出系统的选项。使用scanf获取用户的选择,并通过switch语句根据用户的选择执行相应的操作。 - 操作执行:
switch语句中根据用户的选择,执行相应的操作。如果用户选择查单词,则进入嵌套循环,调用searchWord函数实现连续查询。如果用户选择背单词,则调用memorizeWord函数执行背单词操作。如果用户选择退出系统,则输出退出信息并调用exit(0)退出程序。- 查单词操作: 在选择查单词时,通过嵌套循环实现连续查询。用户可以在一次查询结束后选择是否继续查询,通过输入 ‘y’ 或 ‘n’ 决定。内部调用
searchWord函数进行查询,保留用户的选择状态。 - 背单词操作: 在选择背单词时,调用
memorizeWord函数执行背单词操作。用户在背单词的过程中可以通过按下任意键继续背下一个单词,包括 Enter 键。通过嵌套循环和非阻塞键盘输入的方式实现。 - 退出系统操作: 在选择退出系统时,输出退出信息并调用
exit(0)退出程序,结束主循环。
- 查单词操作: 在选择查单词时,通过嵌套循环实现连续查询。用户可以在一次查询结束后选择是否继续查询,通过输入 ‘y’ 或 ‘n’ 决定。内部调用
三、查单词函数
这C语言函数用于在给定的文件中搜索指定的英文单词。
英语单词文件已进行资源绑定,可以在我的资源中进行查看。
void searchWord(const char *filename)
{// 变量定义FILE *file;int flag = 0;char searchWord[MAX_WORD_LENGTH];struct EnglishWord currentWord;// 打开文件,并检查是否打开成功if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取用户输入待查找的英文单词printf("请输入待查找的英文单词(小写): ");scanf("%s", searchWord);// 遍历文件,查找匹配的英文单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;}}if (0 == flag) {printf("未找到英文单词:%s\n", searchWord);}// 关闭文件fclose(file);
}
-
函数声明:
void searchWord(const char *filename); -
参数:
filename: 包含英文单词及其解释的文件名。
-
局部变量和结构体定义
FILE *file; int flag = 0; char searchWord[MAX_WORD_LENGTH]; struct EnglishWord currentWord;file: 文件指针,用于打开和读取文件。flag: 用于标记是否找到匹配的英文单词。searchWord: 存储用户输入的待查找的英文单词。currentWord: 结构体,包含英文单词和对应的解释。
-
文件打开检查:
if ((file = fopen(filename, "r")) == NULL) {printf("无法打开文件 %s\n", filename);return; }- 检查文件是否成功打开,如果未成功,则输出错误信息并返回。
-
用户输入待查找的英文单词:
printf("请输入待查找的英文单词(小写): "); scanf("%s", searchWord);- 提示用户输入待查找的英文单词。
-
遍历文件并比较英文单词:
while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF) {// 检查是否找到匹配的英文单词if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;} }- 使用**
fscanf**逐行读取文件内容,比较每一行的英文单词与用户输入的待查找单词。 - 如果找到匹配,输出英文单词和解释,设置**
flag**为1。
- 使用**
-
输出结果:
if (0 == flag) {printf("未找到英文单词:%s\n", searchWord); }- 如果未找到匹配的英文单词,输出相应提示。
-
关闭文件:
fclose(file);- 关闭打开的文件,以防止内存泄漏
四、背单词函数
通过逐个从文件中读取英文单词及其解释,使用户能够逐个记忆这些单词,并且能够读取上次结束的位置。
英语单词文件已进行资源绑定,可以在我的资源中进行查看。
void memorizeWord(const char *filename)
{// 变量定义char ch;FILE *file;FILE *recordFile;long lastPosition = 0;struct EnglishWord currentWord;// 打开文件,并检查是否打开成功if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取文件最后载入位置if ((recordFile = fopen("position_record.txt", "r")) == NULL){printf("单词位置记录失败!");return;}else{fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET);}// 逐一输入单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){FILE *recordFile;// 判断是否继续背单词printf("按任意键背下一单词(q to quit)");scanf(" %c", &ch);if (ch == 'q') { break; }while ((ch = getchar()) != '\n' && ch != EOF);printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);// 将本次读取的单词位置保存进新文件lastPosition = ftell(file);if ((recordFile = fopen("position_record.txt", "w")) == NULL){printf("单词位置记录失败!");}else{fprintf(recordFile, "%ld", lastPosition);fclose(recordFile);}}// 关闭文件fclose(file);
}
-
打开文件:
- 函数接受一个文件名作为参数,并尝试以只读模式打开该文件。
- 如果文件打开失败,函数打印错误消息并返回。
if ((file = fopen(filename, "r")) == NULL) {printf("无法打开文件 %s\n", filename);return; } -
获取上次读取的位置:
- 函数尝试打开名为 “position_record.txt” 的记录文件,该文件保存上次读取的文件位置。
- 如果记录文件打开失败,函数打印错误消息并返回。
- 如果成功打开记录文件,函数读取上次读取的文件位置,并将文件指针移到该位置。
if ((recordFile = fopen("position_record.txt", "r")) == NULL) {printf("单词位置记录失败!");return; } else {fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET); } -
逐个输入单词:
- 使用循环从文件中逐个读取英文单词及其解释,存储在结构体
struct EnglishWord中。 - 在每个单词显示后,程序提示用户按任意键继续或按 ‘q’ 键退出。
- 用户按 ‘q’ 键退出时,循环终止。
while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF) {// ... (显示单词,等待用户输入)if (ch == 'q') { break; }// ... (保存当前读取位置) } - 使用循环从文件中逐个读取英文单词及其解释,存储在结构体
-
记录当前读取位置:
- 在每次成功读取一个单词后,将当前文件指针位置保存到 “position_record.txt” 文件中,以便下一次程序运行时能够从上次中断的位置继续读取。
lastPosition = ftell(file); if ((recordFile = fopen("position_record.txt", "w")) == NULL) {printf("单词位置记录失败!"); } else {fprintf(recordFile, "%ld", lastPosition);fclose(recordFile); } -
关闭文件:
- 最后关闭打开的文件。
fclose(file);
五、补充
-
完整程序
/* 相关头文件 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>/* 单词最大长度 和 单词定义最大长度 */ #define MAX_WORD_LENGTH 20 #define MAX_DEFINITION_LENGTH 200// 结构体定义表示一个英文单词 struct EnglishWord {char word[MAX_WORD_LENGTH];char definition[MAX_DEFINITION_LENGTH]; };// 函数声明 void searchWord(const char *filename); void memorizeWord(const char *filename);int main() {// 定义int choice;printf("--------英语单词词典--------\n");printf("\t1. 查单词\n");printf("\t2、背单词\n");printf("\t0. 退出系统\n");printf("请选择操作:");scanf("%d", &choice);switch(choice) {case 1: /* 连续查询 */while(1) {char ch;searchWord("English.txt");printf("继续搜索单词(y/n): ");scanf(" %c", &ch); // 在%c前添加一个空格以跳过可能的空白字符while(getchar() != '\n');if (ch == 'n') {break;}}break;case 2:memorizeWord("English.txt");break;default:printf("无效选择,请重新输入!");} return 0; }// 查找英文单词的函数 void searchWord(const char *filename) {/* 定义 */FILE *file;int flag = 0;char searchWord[MAX_WORD_LENGTH];struct EnglishWord currentWord;/* 打开文件,并检查是否打开成功 */if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}printf("请输入待查找的英文单词(小写): ");scanf("%s", searchWord);/* 遍历文件,同时将格式化文件的内容逐一赋值到 word 和 definition 中 */while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){// 检查是否找到匹配的英文单词if (strncmp(currentWord.word, searchWord, strlen(searchWord)) == 0){printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);flag = 1;}}if (0 == flag) {printf("未找到英文单词:%s\n", searchWord);}// 一定要关闭文件,防止内存泄漏fclose(file); }void memorizeWord(const char *filename) {char ch;FILE *file;FILE *recordFile;long lastPosition = 0; struct EnglishWord currentWord;// if ((file = fopen(filename, "r")) == NULL){printf("无法打开文件 %s\n", filename);return;}// 获取文件最后载入位置if ((recordFile = fopen("position_record.txt", "r")) == NULL){printf("单词位置记录失败!");return;}else {fscanf(recordFile, "%ld", &lastPosition);fclose(recordFile);fseek(file, lastPosition, SEEK_SET); }// 逐一输入单词while (fscanf(file, "%s %[^\n]", currentWord.word, currentWord.definition) != EOF){FILE *recordFile;/* 判断是否继续背单词 */printf("按任意键背下一单词(q to quit)");scanf(" %c", &ch); // 获取用户输入if (ch == 'q') { break; }while ((ch = getchar()) != '\n' && ch != EOF);printf("\t英文单词: %s\n\t解释: %s\n\n", currentWord.word, currentWord.definition);/* 将本次读取的单词位置保存进新文件 */lastPosition = ftell(file);if ((recordFile = fopen("position_record.txt", "w")) == NULL){printf("单词位置记录失败!");}else{fprintf(recordFile, "%ld", lastPosition);fclose(recordFile);}}fclose(file); }
相关文章:
【C语言】简易英语词典
文章目录 一、定义英语单词信息的结构体二、主函数功能逻辑三、查单词函数四、背单词函数五、补充 一、定义英语单词信息的结构体 添加必要的头文件、宏定义和声明,之后定义英语单词信息结构体。 /* 头文件和宏定义 */ #include <stdio.h> #include <std…...
【算法题】104. 二叉树的最大深度
题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,nul…...
Docker配置Portainer容器管理界面
目录 一、Portainer 简介 优点: 缺点: 二、环境配置 1. 拉取镜像 2. 创建启动容器 三、操作测试 1. 进入容器 2. 拉取镜像并部署 3. 访问测试 一、Portainer 简介 Portainer 是一个开源的轻量级容器管理界面,用于管理 Docker 容器…...
Linux network namespace 访问外网以及多命名空间通信(经典容器组网 veth pair + bridge 模式认知)
写在前面 整理K8s网络相关笔记博文内容涉及 Linux network namespace 访问外网方案 Demo实际上也就是 经典容器组网 veth pair bridge 模式理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已…...
网络渗透测试:Wireshark抓取qq图片
Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…...
网络协议与攻击模拟_16HTTP协议
1、HTTP协议结构 2、在Windows server去搭建web扫描器 3、分析HTTP协议流量 一、HTTP协议 1、概念 HTTP(超文本传输协议)用于在万维网服务器上传输超文本(HTML)到本地浏览器的传输协议 基于TCP/IP(HTML文件、图片、查询结构等&…...
叙事弧基础
原文:MasterClass. 2020. Learn About Narrative Arcs: Definition, Examples, and How to Create a Narrative Arc in Your Writing - 2021. https://www.masterclass.com/articles/what-are-the-elements-of-a-narrative-arc-and-how-do-you-create-one-in-writin…...
python从入门到精通(二十):python的exe程序打包制作
python的exe程序打包制作 python打包的概念python打包的模块导入模块安装验证基本语法命令参数文件夹模式单文件模式资源嵌入exe更改图标启动画面(闪屏)禁用异常提示 python打包的概念 将普通的*.py程序文件打包成exe文件。exe文件即可执行文件…...
three.js 细一万倍教程 从入门到精通(一)
目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …...
电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真
1.设计要求 设计、制作一个纪念馆游客进出自动计数显示器。 某县,有一个免费参观的“陶渊明故里纪念馆”,游客进出分道而行,如同地铁有确保单向通行的措施。在入口与出口处分别设有红外检测、声响、累加计数器装置,当游人进&#…...
Python数学建模之回归分析
1.基本概念及应用场景 回归分析是一种预测性的建模技术,数学建模中常用回归分析技术寻找存在相关关系的变量间的数学表达式,并进行统计推断。例如,司机的鲁莽驾驶与交通事故的数量之间的关系就可以用回归分析研究。回归分析根据变量的…...
单片机学习笔记---DS18B20温度传感器
目录 DS18B20介绍 模拟温度传感器的基本结构 数字温度传感器的应用 引脚及应用电路 DS18B20的原理图 DS18B20内部结构框图 暂存器内部 单总线介绍 单总线电路规范 单总线时序结构 初始化 发送一位 发送一个字节 接收一位 接收一个字节 DS18B20操作流程 指令介…...
【网络】WireShark过滤 | WireShark实现TCP三次握手和四次挥手
目录 一、开启WireShark的大门 1.1 WireShark简介 1.2 常用的Wireshark过滤方式 二、如何抓包搜索关键字 2.1 协议过滤 2.2 IP过滤 编辑 2.3 过滤端口 2.4 过滤MAC地址 2.5 过滤包长度 2.6 HTTP模式过滤 三、ARP协议分析 四、WireShark之ICMP协议 五、TCP三次握…...
开源免费的Linux服务器管理面板分享
开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…...
leetcode算法-位运算
位运算,直接在二进制上进行的按位操作,位运算的种类如下: 1.按位异或^:异或的含义是操作的两位不同,则结果为1,相同则结果为0,所以两个相同的数异或,结果应该是0,3^3的结果是0,3^4的…...
「MySQL」约束
概述 分类 约束描述关键字非空约束限制该字段的数据不能为 nullNOT NULL唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY默认约束保存数据时,如果未指定该字段的值,则采…...
C语言:详解操作符(下)
上一篇链接:C语言:详解操作符(上)摘要: 在上篇文章中,我们已经讲过位操作符等涉及二进制的操作符,这些有助于帮助我们后期理解数据如何在计算机中运算并存储,接下来本篇将更多的讲述…...
Vue3.0(六):VueX 4.x详解
Vuex4状态管理 什么是状态管理 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在应用程序的某一个位置,对于这些数据的管理,就是 状态管理目前前端项目越来越复杂,多组件共享同一数据的状态很常见…...
突破编程_C++_面试(基础知识(13))
面试题45:C中的字符串如何存储 在C中,字符串可以通过多种方式存储,但最常见和推荐使用的方式是通过 std::string 类,该类位于 <string> 头文件中。std::string 是一个类模板的实例,通常用于存储字符数组&#x…...
掌握C语言文件操作:从入门到精通的完整指南!
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&a…...
从AT24C02 EEPROM的I2C时序出发,手把手调试你的蓝桥杯单片机存储模块
从AT24C02 EEPROM的I2C时序出发,手把手调试你的蓝桥杯单片机存储模块 在蓝桥杯单片机竞赛中,AT24C02 EEPROM存储模块的稳定读写是基本功,但真正的高手往往能在底层通信协议层面发现问题、解决问题。本文将带你从I2C时序的微观视角,…...
Cadence ADE保姆级教程:手把手教你用S参数文件提取变压器QLk指标(附完整公式)
Cadence ADE实战指南:从S参数文件到变压器QLk指标的全流程解析 在射频集成电路设计中,变压器作为关键无源器件,其性能直接影响整个系统的效率与稳定性。QLk指标(品质因数Q、电感值L和耦合系数k)的准确提取,…...
ARMv8-A架构LDP与LDR内存加载指令详解
1. A64指令集内存加载指令概述在ARMv8-A架构的A64指令集中,LDP(Load Pair)和LDR(Load Register)是两类最基础且关键的内存加载指令。作为从事ARM架构开发多年的工程师,我经常需要在底层系统编程和性能优化中…...
你的打印机“糊”了?可能是半色调没调好!详解HP/佳能/Epson的驱动设置与图像预处理
你的打印机“糊”了?可能是半色调没调好!详解HP/佳能/Epson的驱动设置与图像预处理 当精心修图的照片在打印机上输出后出现奇怪的网格纹路,或是设计稿的渐变区域出现明显色阶断层时,多数用户的第一反应往往是怀疑打印机硬件故障。…...
从理论到代码:一步步拆解单纯形法在MATLAB中的核心‘旋转运算’
从理论到代码:一步步拆解单纯形法在MATLAB中的核心‘旋转运算’ 单纯形法作为线性规划领域最经典的算法之一,其理论优雅性与计算高效性在数学优化中独树一帜。然而,当我们将教科书中的表格计算转化为编程语言实现时,往往会遇到一个…...
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南
uniCloud云函数实战:从‘Hello World’到连接数据库的完整数据流指南 在当今快速迭代的互联网开发领域,后端服务的轻量化与敏捷部署已成为开发者关注的焦点。uniCloud作为一款面向全栈开发的云服务平台,其云函数功能让前端开发者也能轻松处理…...
从缺页异常看Linux内存管理的基石:写时复制、延迟分配与交换机制
从缺页异常看Linux内存管理的基石:写时复制、延迟分配与交换机制 当你在Linux终端敲下./a.out时,内核如何将磁盘上的程序转化为内存中的鲜活进程?这个看似简单的过程背后,隐藏着一套精妙的内存管理机制。缺页异常(Page…...
UMI 采集技术落地应用 核数聚助力人形机器人快速迭代
在具身智能从实验室走向产业落地的关键期,数据饥渴已成为行业公认的核心瓶颈。传统真机遥操作采集成本高、效率低、泛化性差,仿真数据又存在物理真实性不足的问题。此时,UMI(Universal Manipulation Interface,通用操作…...
别再只用SSH了!深入对比新华三设备Telnet的三种认证模式(None/Password/AAA)及适用场景
新华三设备Telnet认证模式深度解析:从安全权衡到场景适配 在网络设备管理的工具箱里,远程访问协议的选择往往决定了运维效率和安全性之间的平衡点。作为网络管理员,我们常常陷入这样的困境:是选择便捷性还是安全性?是追…...
论Serverless 架构模式
serverless架构随着云计算技术的迭代与微服务架构的普及,企业对 IT 系统的弹性伸缩、成本优化及运维效率提出了更高要求 —— 既需快速响应业务峰值需求,又需降低闲置资源消耗,同时减少基础设施运维负担。Serverless 架构模式(无服…...
