用C语言编写一个程序,使之接收三个运行参数,分别为两个文件路径和一个无符号整数型,首先读取第一个路径对应文件内容,其中包含保存的若干用户的用户名和明文密码,用无符号整数型作为偏移量对密码进行凯撒密码加密,将用户名和加密后的密码输出到第二个路径对应的文件中,运行时加密偏移量为1
时间: 2024-02-22 21:59:49 浏览: 74
好的,这是一个关于文件读写和字符串处理的问题。下面是实现的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
// 检查命令行参数个数是否正确
if (argc != 4) {
printf("Usage: %s <file_in> <file_out> <offset>\n", argv[0]);
return 1;
}
// 读取命令行参数
char *file_in = argv[1];
char *file_out = argv[2];
int offset = atoi(argv[3]);
// 打开输入和输出文件
FILE *f_in = fopen(file_in, "r");
FILE *f_out = fopen(file_out, "w");
// 检查文件是否打开成功
if (f_in == NULL || f_out == NULL) {
printf("Error: failed to open file.\n");
return 1;
}
// 读取每一行数据并加密后输出到输出文件中
char buf[1024];
while (fgets(buf, sizeof(buf), f_in) != NULL) {
// 分割出用户名和密码
char *username = strtok(buf, " \r\n");
char *password = strtok(NULL, " \r\n");
// 对密码进行凯撒密码加密
for (int i = 0; i < strlen(password); i++) {
if (password[i] >= 'a' && password[i] <= 'z') {
password[i] = 'a' + (password[i] - 'a' + offset) % 26;
}
}
// 输出用户名和加密后的密码到输出文件中
fprintf(f_out, "%s %s\n", username, password);
}
// 关闭输入和输出文件
fclose(f_in);
fclose(f_out);
return 0;
}
```
这段代码首先使用 `argc` 和 `argv[]` 获取命令行参数,第一个参数为输入文件路径,第二个参数为输出文件路径,第三个参数为加密偏移量。注意,这里的命令行参数都是字符串类型,需要使用 `atoi()` 函数将偏移量转换为整数类型。
接着,使用 `fopen()` 函数打开输入文件和输出文件,使用 `"r"` 和 `"w"` 模式分别表示读和写。然后使用 `fgets()` 函数读取每一行数据,并使用 `strtok()` 函数分割出用户名和密码。注意,这里使用空格、回车和换行符作为分隔符。
接下来,对密码进行凯撒密码加密。对于字符串中的每一个字符,如果它是小写字母,则将其转换为加密后的字符。具体地,将其转换为 ASCII 码值后减去小写字母 `a` 的 ASCII 码值,然后加上偏移量并取模,最后加上小写字母 `a` 的 ASCII 码值并转换为字符。
最后,使用 `fprintf()` 函数将用户名和加密后的密码格式化后输出到输出文件中。
最后,使用 `fclose()` 函数关闭输入和输出文件,避免资源泄漏。
阅读全文