C语言实现小型电子词典攻略
项目概述
这是一个使用C语言实现的小型电子词典,它可以通过命令行窗口输入单词并查询其对应的中文翻译。本词典基于哈希表实现。哈希表是一种数据结构,可以快速地进行查询和插入操作,因此非常适合用于实现词典这样的查询应用。
实现步骤
1. 读取词典文件
首先需要从词典文件中读取单词和对应的中文翻译,这里推荐使用标准数据格式JSON来存储词典数据。JSON格式非常方便读取、修改和传输,并且有很多现成的解析库可以使用。
下面是一个简单的示例,展示如何读取一个JSON格式的词典文件:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h" // 引入cJSON库
int main() {
FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
char buffer[1024];
fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
fclose(fp); // 关闭文件
cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
if (json == NULL) {
printf("解析JSON出错\n");
exit(1);
}
cJSON *word = cJSON_GetObjectItem(json, "hello"); // 获取单词hello的JSON对象
if (word == NULL) {
printf("找不到单词hello\n");
exit(1);
}
cJSON *translation = cJSON_GetObjectItem(word, "translation"); // 获取hello的翻译
if (translation == NULL) {
printf("找不到单词hello的翻译\n");
exit(1);
}
printf("hello的翻译是%s\n", translation->valuestring);
cJSON_Delete(json); // 释放内存
return 0;
}
2. 初始化哈希表
接下来需要初始化哈希表,将词典中的所有单词按照哈希函数的规则插入到哈希表中。这里使用了一种非常简单的哈希函数,即将单词的ASCII码值相加。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 1000
// 哈希表节点结构体
typedef struct hash_node {
char *key;
char *value;
struct hash_node *next;
} HashNode;
// 哈希表结构体
typedef struct hash_table {
HashNode *nodes[TABLE_SIZE];
} HashTable;
// 哈希函数
unsigned long hash(char *str) {
unsigned long hash = 5381;
int c;
while ((c = *str++) != '\0') {
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
}
return hash;
}
// 初始化哈希表
void initHashTable(HashTable *ht) {
for (int i = 0; i < TABLE_SIZE; i++) {
ht->nodes[i] = NULL;
}
}
// 插入哈希表节点
void insertNode(HashTable *ht, char *key, char *value) {
unsigned long index = hash(key) % TABLE_SIZE; // 计算哈希值
HashNode *node = (HashNode *)malloc(sizeof(HashNode)); // 创建新节点
node->key = key;
node->value = value;
node->next = ht->nodes[index]; // 将节点插入链表的头部
ht->nodes[index] = node;
}
// 查找哈希表节点
char *findNode(HashTable *ht, char *key) {
unsigned long index = hash(key) % TABLE_SIZE; // 计算哈希值
HashNode *node = ht->nodes[index]; // 获取链表
while (node != NULL) {
if (strcmp(node->key, key) == 0) { // 找到节点
return node->value;
}
node = node->next;
}
return NULL;
}
// 释放哈希表内存
void freeHashTable(HashTable *ht) {
for (int i = 0; i < TABLE_SIZE; i++) {
HashNode *node = ht->nodes[i];
while (node != NULL) {
HashNode *next = node->next;
free(node->key);
free(node->value);
free(node);
node = next;
}
}
}
int main() {
HashTable ht;
initHashTable(&ht);
insertNode(&ht, "hello", "你好");
insertNode(&ht, "world", "世界");
char *value = findNode(&ht, "hello");
if (value != NULL) {
printf("hello的翻译是%s\n", value);
}
freeHashTable(&ht);
return 0;
}
3. 命令行交互
最后需要在命令行中与用户进行交互,读取用户输入的单词并查询其翻译。这里使用了一个简单的循环来读取用户的输入并输出翻译结果。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 1000
// 省略哈希表结构体和函数,与上面一样
int main() {
HashTable ht;
initHashTable(&ht);
FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
char buffer[1024];
fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
fclose(fp); // 关闭文件
cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
if (json == NULL) {
printf("解析JSON出错\n");
exit(1);
}
cJSON *word = json->child;
while (word != NULL) { // 将词典中的单词插入哈希表
char *key = word->string;
cJSON *translation = cJSON_GetObjectItem(word, "translation");
char *value = translation->valuestring;
insertNode(&ht, key, value);
word = word->next;
}
cJSON_Delete(json); // 释放内存
while (1) { // 循环获取用户输入并输出翻译结果
printf("请输入要查询的单词(按q退出):");
char input[100];
fgets(input, 100, stdin);
input[strlen(input) - 1] = '\0'; // 去掉换行符
if (strcmp(input, "q") == 0) { // 退出程序
break;
}
char *value = findNode(&ht, input);
if (value != NULL) {
printf("%s的翻译是%s\n", input, value);
} else {
printf("找不到%s\n", input);
}
}
freeHashTable(&ht);
return 0;
}
示例说明
示例1:读取JSON数据
假设词典文件dictionary.json的内容如下:
{
"hello": {
"translation": "你好"
},
"world": {
"translation": "世界"
}
}
则可以使用以下代码读取JSON数据并输出hello单词的翻译:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
int main() {
FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
char buffer[1024];
fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
fclose(fp); // 关闭文件
cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
if (json == NULL) {
printf("解析JSON出错\n");
exit(1);
}
cJSON *word = cJSON_GetObjectItem(json, "hello"); // 获取单词hello的JSON对象
if (word == NULL) {
printf("找不到单词hello\n");
exit(1);
}
cJSON *translation = cJSON_GetObjectItem(word, "translation"); // 获取hello的翻译
if (translation == NULL) {
printf("找不到单词hello的翻译\n");
exit(1);
}
printf("hello的翻译是%s\n", translation->valuestring);
cJSON_Delete(json); // 释放内存
return 0;
}
示例2:命令行交互
假设词典文件dictionary.json的内容与上面一样,则可以使用以下代码实现命令行交互查询:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 1000
// 省略哈希表结构体和函数,与上面一样
int main() {
HashTable ht;
initHashTable(&ht);
FILE *fp = fopen("dictionary.json", "r"); // 打开词典文件
char buffer[1024];
fread(buffer, sizeof(char), 1024, fp); // 读取JSON数据
fclose(fp); // 关闭文件
cJSON *json = cJSON_Parse(buffer); // 解析JSON数据
if (json == NULL) {
printf("解析JSON出错\n");
exit(1);
}
cJSON *word = json->child;
while (word != NULL) { // 将词典中的单词插入哈希表
char *key = word->string;
cJSON *translation = cJSON_GetObjectItem(word, "translation");
char *value = translation->valuestring;
insertNode(&ht, key, value);
word = word->next;
}
cJSON_Delete(json); // 释放内存
while (1) { // 循环获取用户输入并输出翻译结果
printf("请输入要查询的单词(按q退出):");
char input[100];
fgets(input, 100, stdin);
input[strlen(input) - 1] = '\0'; // 去掉换行符
if (strcmp(input, "q") == 0) { // 退出程序
break;
}
char *value = findNode(&ht, input);
if (value != NULL) {
printf("%s的翻译是%s\n", input, value);
} else {
printf("找不到%s\n", input);
}
}
freeHashTable(&ht);
return 0;
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现小型电子词典 - Python技术站