用c语言写一个密码柜要求存储密码
时间: 2023-05-29 22:01:14 浏览: 89
对于一个密码柜,需要实现以下功能:
1. 存储密码:将输入的密码存储到文件中;
2. 读取密码:从文件中读取保存的密码;
3. 验证密码:输入密码,判断密码是否正确。
下面是一个基于C语言的简单密码柜实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 255
void store_password(char* password);
void read_password();
int verify_password(char* password);
int main(int argc, char* argv[]) {
int option;
char password[MAX_LEN + 1];
// 从命令行读取参数
if (argc == 1) {
option = -1;
} else if (argc == 2 && strcmp(argv[1], "-r") == 0) {
option = 1;
} else if (argc == 3 && strcmp(argv[1], "-s") == 0) {
option = 2;
strncpy(password, argv[2], MAX_LEN);
} else {
printf("Usage: ./password_manager [-r | -s password]\n");
return 1;
}
// 执行对应操作
switch (option) {
case -1:
printf("Usage: ./password_manager [-r | -s password]\n");
break;
case 1:
read_password();
break;
case 2:
store_password(password);
break;
default:
printf("Invalid option!\n");
break;
}
return 0;
}
void store_password(char* password) {
FILE* fp;
fp = fopen("password.txt", "w");
if (fp == NULL) {
printf("Failed to open file for writing!\n");
exit(1);
}
fwrite(password, strlen(password), 1, fp);
printf("Password stored successfully!\n");
fclose(fp);
}
void read_password() {
FILE* fp;
char password[MAX_LEN + 1];
fp = fopen("password.txt", "r");
if (fp == NULL) {
printf("No password stored yet!\n");
exit(1);
}
fread(password, MAX_LEN, 1, fp);
if (verify_password(password)) {
printf("Password read successfully: %s\n", password);
} else {
printf("Password is not correct!\n");
}
fclose(fp);
}
int verify_password(char* password) {
char input_password[MAX_LEN + 1];
printf("Enter your password: ");
fgets(input_password, MAX_LEN, stdin);
// 去除末尾的换行符
if (input_password[strlen(input_password) - 1] == '\n') {
input_password[strlen(input_password) - 1] = '\0';
}
return strcmp(password, input_password) == 0;
}
```
在程序中,我们通过命令行参数控制程序的行为:
- 如果不带参数或者参数不正确,程序将打印用法信息;
- 如果参数为 `-r`,程序读取并打印存储的密码;
- 如果参数为 `-s password`,程序将输入的密码存储到文件中。
在存储密码和读取密码的函数中,使用了 C 标准库中的 `fwrite` 和 `fread` 函数来进行文件操作。这两个函数的用法和 `fscanf` 和 `fprintf` 类似,可以参考相关文档。在读取密码时需要注意去除字符串末尾的换行符,否则验证密码时可能会出错。
最后,值得注意的是,上述程序并没有对密码进行加密处理,因此存储的密码可以直接被读取。在实际应用中,密码需要经过加密后再存储,以保证安全性。