tools: git save username and password

Git保存用户名和密码
博客围绕Git工具展开,核心内容是如何保存用户名和密码,这在使用Git进行代码管理时能提高操作效率,避免每次操作都重复输入信息,与信息技术领域的版本控制密切相关。
git config --global credential.helper store

 

 

现有程序,文件WJ代码内容如下: main.c文件: #include "Recipe.h" void display_menu() { printf("\n===== 家庭菜谱管理系统 =====\n"); printf("1. 添加菜谱\n"); printf("2. 删除菜谱\n"); printf("3. 修改菜谱\n"); printf("4. 查找菜谱\n"); printf("5. 随机推荐\n"); printf("6. 退出系统\n"); printf("===========================\n"); printf("请选择操作: "); } int main() { // 设置控制台支持UTF-8 system("chcp 65001 > nul"); load_recipes(); // 加载现有数据 int running = 1; while (running) { display_menu(); int choice; scanf("%d", &choice); getchar(); // 消耗换行符 switch(choice) { case 1: add_recipe(); break; case 2: delete_recipe(); break; case 3: modify_recipe(); break; case 4: search_recipes(); break; case 5: random_select(); break; case 6: running = 0; break; default: printf("无效选择!\n"); } } printf("系统已退出\n"); return 0; } Recipe.c文件: #include "Recipe.h" // 全局变量初始化 Recipe recipes[MAX_RECIPES]; int recipe_count = 0; int next_id = 1; // 从文件加载菜谱数据 void load_recipes() { FILE *file = fopen("recipes.dat", "rb"); if (!file) return; fread(&recipe_count, sizeof(int), 1, file); fread(&next_id, sizeof(int), 1, file); fread(recipes, sizeof(Recipe), recipe_count, file); fclose(file); } // 保存菜谱数据到文件 void save_recipes() { FILE *file = fopen("recipes.dat", "wb"); if (!file) { printf("保存失败!\n"); return; } fwrite(&recipe_count, sizeof(int), 1, file); fwrite(&next_id, sizeof(int), 1, file); fwrite(recipes, sizeof(Recipe), recipe_count, file); fclose(file); } // 添加新菜谱 void add_recipe() { if (recipe_count >= MAX_RECIPES) { printf("菜谱库已满!\n"); return; } Recipe new_recipe; new_recipe.id = next_id++; printf("请输入菜名: "); fgets(new_recipe.name, MAX_NAME_LEN, stdin); new_recipe.name[strcspn(new_recipe.name, "\n")] = 0; printf("分类(凉菜/热菜/汤羹等): "); fgets(new_recipe.category, MAX_CAT_LEN, stdin); new_recipe.category[strcspn(new_recipe.category, "\n")] = 0; printf("食材(用逗号分隔): "); fgets(new_recipe.ingredients, MAX_INGREDIENTS, stdin); new_recipe.ingredients[strcspn(new_recipe.ingredients, "\n")] = 0; printf("制作步骤(用分号;分隔): "); fgets(new_recipe.steps, MAX_STEPS, stdin); new_recipe.steps[strcspn(new_recipe.steps, "\n")] = 0; printf("制作时间(分钟): "); scanf("%d", &new_recipe.prep_time); getchar(); // 消耗换行符 printf("所需器具: "); fgets(new_recipe.tools, MAX_TOOLS, stdin); new_recipe.tools[strcspn(new_recipe.tools, "\n")] = 0; printf("爱好者: "); fgets(new_recipe.for_whom, MAX_FOR_WHOM, stdin); new_recipe.for_whom[strcspn(new_recipe.for_whom, "\n")] = 0; printf("口味(清淡/麻辣等): "); fgets(new_recipe.flavor, MAX_FLAVOR, stdin); new_recipe.flavor[strcspn(new_recipe.flavor, "\n")] = 0; printf("菜系(川菜/粤菜等): "); fgets(new_recipe.cuisine, MAX_CUISINE, stdin); new_recipe.cuisine[strcspn(new_recipe.cuisine, "\n")] = 0; recipes[recipe_count++] = new_recipe; save_recipes(); printf("添加成功! ID: %d\n", new_recipe.id); } // 通过ID查找菜谱 int find_recipe_by_id(int id) { for (int i = 0; i < recipe_count; i++) { if (recipes[i].id == id) return i; } return -1; } // 通过名称查找菜谱 int find_recipe_by_name(const char *name) { for (int i = 0; i < recipe_count; i++) { if (strcmp(recipes[i].name, name) == 0) return i; } return -1; } // 删除菜谱 void delete_recipe() { char input[50]; printf("输入要删除的菜名或ID: "); fgets(input, 50, stdin); input[strcspn(input, "\n")] = 0; int index = -1; if (isdigit(input[0])) { index = find_recipe_by_id(atoi(input)); } else { index = find_recipe_by_name(input); } if (index == -1) { printf("未找到菜谱!\n"); return; } printf("确定删除 '%s' (ID: %d)? (y/n): ", recipes[index].name, recipes[index].id); char confirm = getchar(); getchar(); // 消耗换行符 if (confirm == 'y' || confirm == 'Y') { // 移动数组元素 for (int i = index; i < recipe_count - 1; i++) { recipes[i] = recipes[i + 1]; } recipe_count--; save_recipes(); printf("已删除!\n"); } else { printf("取消删除\n"); } } // 修改菜谱 void modify_recipe() { char input[50]; printf("输入要修改的菜名或ID: "); fgets(input, 50, stdin); input[strcspn(input, "\n")] = 0; int index = -1; if (isdigit(input[0])) { index = find_recipe_by_id(atoi(input)); } else { index = find_recipe_by_name(input); } if (index == -1) { printf("未找到菜谱!\n"); return; } printf("当前信息:\n"); print_recipe(recipes[index]); printf("选择要修改的字段:\n"); printf("1.菜名\n2.分类\n3.食材\n4.步骤\n5.时间\n6.器具\n7.喜好者\n8.口味\n9.菜系\n"); int choice; scanf("%d", &choice); getchar(); // 消耗换行符 switch(choice) { case 1: printf("新菜名: "); fgets(recipes[index].name, MAX_NAME_LEN, stdin); recipes[index].name[strcspn(recipes[index].name, "\n")] = 0; break; case 2: printf("新分类: "); fgets(recipes[index].category, MAX_CAT_LEN, stdin); recipes[index].category[strcspn(recipes[index].category, "\n")] = 0; break; case 3: printf("新食材: "); fgets(recipes[index].ingredients, MAX_INGREDIENTS, stdin); recipes[index].ingredients[strcspn(recipes[index].ingredients, "\n")] = 0; break; case 4: printf("新步骤: "); fgets(recipes[index].steps, MAX_STEPS, stdin); recipes[index].steps[strcspn(recipes[index].steps, "\n")] = 0; break; case 5: printf("新时间(分钟): "); scanf("%d", &recipes[index].prep_time); getchar(); break; case 6: printf("新器具: "); fgets(recipes[index].tools, MAX_TOOLS, stdin); recipes[index].tools[strcspn(recipes[index].tools, "\n")] = 0; break; case 7: printf("新喜好者: "); fgets(recipes[index].for_whom, MAX_FOR_WHOM, stdin); recipes[index].for_whom[strcspn(recipes[index].for_whom, "\n")] = 0; break; case 8: printf("新口味: "); fgets(recipes[index].flavor, MAX_FLAVOR, stdin); recipes[index].flavor[strcspn(recipes[index].flavor, "\n")] = 0; break; case 9: printf("新菜系: "); fgets(recipes[index].cuisine, MAX_CUISINE, stdin); recipes[index].cuisine[strcspn(recipes[index].cuisine, "\n")] = 0; break; default: printf("无效选择\n"); return; } save_recipes(); printf("修改成功!\n"); } // 打印菜谱详情 void print_recipe(Recipe r) { printf("\n===== 菜谱详情 =====\n"); printf("ID: %d\n", r.id); printf("菜名: %s\n", r.name); printf("分类: %s\n", r.category); printf("食材: %s\n", r.ingredients); printf("步骤: %s\n", r.steps); printf("时间: %d分钟\n", r.prep_time); printf("器具: %s\n", r.tools); printf("适合人群: %s\n", r.for_whom); printf("口味: %s\n", r.flavor); printf("菜系: %s\n", r.cuisine); printf("====================\n"); } // 搜索菜谱 void search_recipes() { printf("\n搜索选项:\n"); printf("1.按菜名\n2.按ID\n3.按分类\n4.按时间\n5.按器具\n6.按喜好者\n7.显示全部\n"); int choice; scanf("%d", &choice); getchar(); // 消耗换行符 char query[100]; int found = 0; switch(choice) { case 1: printf("输入菜名: "); fgets(query, 100, stdin); query[strcspn(query, "\n")] = 0; for (int i = 0; i < recipe_count; i++) { if (strstr(recipes[i].name, query)) { print_recipe(recipes[i]); found = 1; } } break; case 2: printf("输入ID: "); scanf("%d", &choice); getchar(); for (int i = 0; i < recipe_count; i++) { if (recipes[i].id == choice) { print_recipe(recipes[i]); found = 1; break; } } break; case 3: printf("输入分类: "); fgets(query, 100, stdin); query[strcspn(query, "\n")] = 0; for (int i = 0; i < recipe_count; i++) { if (strstr(recipes[i].category, query)) { print_recipe(recipes[i]); found = 1; } } break; case 4: printf("最大时间(分钟): "); scanf("%d", &choice); getchar(); for (int i = 0; i < recipe_count; i++) { if (recipes[i].prep_time <= choice) { print_recipe(recipes[i]); found = 1; } } break; case 5: printf("输入器具: "); fgets(query, 100, stdin); query[strcspn(query, "\n")] = 0; for (int i = 0; i < recipe_count; i++) { if (strstr(recipes[i].tools, query)) { print_recipe(recipes[i]); found = 1; } } break; case 6: printf("输入喜好者: "); fgets(query, 100, stdin); query[strcspn(query, "\n")] = 0; for (int i = 0; i < recipe_count; i++) { if (strstr(recipes[i].for_whom, query)) { print_recipe(recipes[i]); found = 1; } } break; case 7: for (int i = 0; i < recipe_count; i++) { print_recipe(recipes[i]); found = 1; } break; default: printf("无效选择\n"); return; } if (!found) printf("未找到匹配结果\n"); } // 生成采购清单 void generate_shopping_list(Recipe *selected, int count) { printf("\n===== 采购清单 =====\n"); for (int i = 0; i < count; i++) { printf("[%s] 食材: %s\n", selected[i].name, selected[i].ingredients); } printf("====================\n"); } // 随机选择菜谱 void random_select() { printf("\n选择类型:\n"); printf("1.单餐\n2.多天计划\n>> "); int choice, days; scanf("%d", &choice); getchar(); if (choice == 2) { printf("输入天数: "); scanf("%d", &days); getchar(); } else { days = 1; } printf("\n筛选条件(回车跳过):\n"); char filter[100]; printf("冷热(冷/热): "); fgets(filter, 100, stdin); filter[strcspn(filter, "\n")] = 0; char temp_filter[100] = {0}; if (strlen(filter) > 0) strcpy(temp_filter, filter); printf("口味: "); fgets(filter, 100, stdin); filter[strcspn(filter, "\n")] = 0; char flavor_filter[100] = {0}; if (strlen(filter) > 0) strcpy(flavor_filter, filter); printf("喜好者: "); fgets(filter, 100, stdin); filter[strcspn(filter, "\n")] = 0; char whom_filter[100] = {0}; if (strlen(filter) > 0) strcpy(whom_filter, filter); // 筛选符合条件的菜谱 Recipe valid_recipes[MAX_RECIPES]; int valid_count = 0; for (int i = 0; i < recipe_count; i++) { int match = 1; if (strlen(temp_filter) > 0 && strstr(recipes[i].category, temp_filter) == NULL) { match = 0; } if (strlen(flavor_filter) > 0 && strstr(recipes[i].flavor, flavor_filter) == NULL) { match = 0; } if (strlen(whom_filter) > 0 && strstr(recipes[i].for_whom, whom_filter) == NULL) { match = 0; } if (match) { valid_recipes[valid_count++] = recipes[i]; } } if (valid_count == 0) { printf("没有符合条件的菜谱!\n"); return; } srand(time(NULL)); Recipe selected[days]; printf("\n===== 推荐菜谱 =====\n"); for (int i = 0; i < days; i++) { int idx = rand() % valid_count; selected[i] = valid_recipes[idx]; printf("第%d天: %s\n", i+1, selected[i].name); } generate_shopping_list(selected, days); } Recipe.h文件: #ifndef RECIPE_H #define RECIPE_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> #define MAX_RECIPES 100 // 最大菜谱数量 #define MAX_NAME_LEN 50 // 菜名最大长度 #define MAX_CAT_LEN 30 // 分类最大长度 #define MAX_INGREDIENTS 200 // 食材描述最大长度 #define MAX_STEPS 500 // 步骤描述最大长度 #define MAX_TOOLS 100 // 器具最大长度 #define MAX_FOR_WHOM 100 // 喜好者最大长度 #define MAX_FLAVOR 30 // 口味最大长度 #define MAX_CUISINE 30 // 菜系最大长度 // 菜谱结构体 typedef struct { int id; // 自动生成的唯一ID char name[MAX_NAME_LEN]; // 菜名 char category[MAX_CAT_LEN]; // 分类(如:凉菜/热菜) char ingredients[MAX_INGREDIENTS]; // 食材 char steps[MAX_STEPS]; // 制作步骤 int prep_time; // 准备时间(分钟) char tools[MAX_TOOLS]; // 所需器具 char for_whom[MAX_FOR_WHOM]; // 适合人群(喜好者) char flavor[MAX_FLAVOR]; // 口味 char cuisine[MAX_CUISINE]; // 菜系 } Recipe; // 全局变量 extern Recipe recipes[MAX_RECIPES]; extern int recipe_count; extern int next_id; // 函数声明 void load_recipes(); void save_recipes(); void add_recipe(); void delete_recipe(); void modify_recipe(); void search_recipes(); void random_select(); void generate_shopping_list(Recipe *selected, int count); void print_recipe(Recipe r); int find_recipe_by_id(int id); int find_recipe_by_name(const char *name); #endif 请先理解这些代码,等一下我会提出对功能代码的修改要求,需要你给出修改后的完整代码
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值