我在c中创建替换密码,从文本文件中读取字符并加密它们。但是,当我运行该程序时,文件中的文本未加密。但是,我不确定我到底错过了什么。任何和所有的帮助表示赞赏。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void encrypt(char *inchar)
{
while (*inchar)
{
if (isalpha(*inchar) && isupper(*inchar))
{
if (*inchar == 'A') {*inchar = 'G';}
if (*inchar == 'B') {*inchar = 'H';}
if (*inchar == 'C') {*inchar = 'B';}
if (*inchar == 'D') {*inchar = 'I';}
if (*inchar == 'E') {*inchar = 'A';}
if (*inchar == 'F') {*inchar = 'L';}
if (*inchar == 'G') {*inchar = 'U';}
if (*inchar == 'H') {*inchar = 'F';}
if (*inchar == 'I') {*inchar = 'P';}
if (*inchar == 'J') {*inchar = 'J';}
if (*inchar == 'K') {*inchar = 'K';}
if (*inchar == 'L') {*inchar = 'T';}
if (*inchar == 'M') {*inchar = 'V';}
if (*inchar == 'N') {*inchar = 'M';}
if (*inchar == 'O') {*inchar = 'M';}
if (*inchar == 'P') {*inchar = 'O';}
if (*inchar == 'Q') {*inchar = 'E';}
if (*inchar == 'R') {*inchar = 'S';}
if (*inchar == 'S') {*inchar = 'N';}
if (*inchar == 'T') {*inchar = 'Q';}
if (*inchar == 'U') {*inchar = 'D';}
if (*inchar == 'V') {*inchar = 'R';}
if (*inchar == 'W') {*inchar = 'W';}
if (*inchar == 'S') {*inchar = 'Z';}
if (*inchar == 'Y') {*inchar = 'S';}
}
}
inchar++;
}
int main (void)
{
FILE *inputFile;
char inputBuffer[80];
char *inputPtr = inputBuffer;
char inchar;
inputFile = fopen("code.txt", "r");
if (inputFile == NULL)
{
printf("Failed to open\n");
return(0);
}
while ((inchar = fgetc(inputFile)) != EOF)
{
putchar(inchar);
}
inputBuffer[strlen(inputBuffer) - 1] = 0;
encrypt(&inchar);
putchar(inchar);
return(0);
}
答案 0 :(得分:1)
文件没有变化,因为你的程序没有做任何可以改变文件内容的内容。
您所做的只是打印(使用putchar()
)加密字符,没有文件编写代码。
您应该打开第二个文件进行写入,并在那里写入结果字符。然后,一旦完成,您可以重命名已写入的文件以替换输入。
答案 1 :(得分:0)
你正在做的事情(以及你所要问的)有几个问题。
您的encrypt
功能实际上不是转换密码。移位密码是密钥 K的加密方案; K&lt; alphabet_size 其中每个字母被字母 K 替换为字母表中的字母(环绕)。你对encrypt
函数的所作所为更多是一种加密密码。
例如,使用键6和英文字母的实际移位密码将如下所示:
char shift_tbl[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF"; // shift cipher with key = 6
加密方案中的“加密”不起作用。
'M'
显示两个不同的输入字符'S'
'X'
和'Z'
您无法将输出写回文件。现在,由于您要用一个其他字符替换每个单个字符,因此在覆盖同一文件时很容易实现。
这是C中正确的移位密码实现,密钥 K = 6 :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char shift_tbl_u[27] = "GHIJKLMNOPQRSTUVWXYZABCDEF";
char shift_tbl_l[27] = "ghijklmnopqrstuvwxyzabcdef";
char encrypt(char inchar)
{
if(isalpha(inchar) && isupper(inchar))
{
return shift_tbl_u[inchar-'A'];
}
else if(isalpha(inchar) && islower(inchar))
{
return shift_tbl_l[inchar-'a'];
}
return inchar; // non alphabetic = no change;
}
int main (void)
{
FILE *fp = fopen("code.txt", "rb+");
char *buffer = NULL;
size_t s_file;
int i;
if(!fp)
{
puts("Could not open code.txt");
exit(EXIT_FAILURE);
}
fseek(fp, 0, SEEK_END);
s_file = ftell(fp);
rewind(fp);
buffer = malloc(s_file + 1);
if(!buffer)
{
perror("malloc");
exit(EXIT_FAILURE);
}
fread(buffer, 1, s_file, fp);
fseek(fp, 0, SEEK_SET);
for(i = 0; i < s_file; i++)
{
char c = encrypt(buffer[i]);
fwrite(&c, 1, 1, fp);
}
free(buffer);
buffer = NULL;
fclose(fp);
return 0;
}
使用示例:
C:\Temp>cl encrypt.c
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
encrypt.c
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:encrypt.exe
encrypt.obj
C:\Temp>type con > code.txt
Hello World
^Z
C:\Temp>encrypt
C:\Temp>type code.txt
Nkrru Cuxrj
C:\Temp>
现在,您可以通过加密所有buffer
来加速执行此程序,然后再将其写回fp
,而不是一次加密和写入一个字符,但是您有一般的想法现在
答案 2 :(得分:0)
您的代码中存在一些错误/错误:
以下代码有效,它从文件中获取一个字符串,并使用6个字符的简单替换/转置对其进行加密(例如A - > G)。
注意:您之前的替换将两个不同的字符更改为相同的
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void encrypt(char inchar)
{
//Changing chars
inchar = inchar + 6; //This is a simple sobstution
//print encrypted char
printf("%c",inchar);
}
int main(int argc, char** argv[])
{
FILE *inputFile;
char inputBuffer[80];
char *inputPtr = inputBuffer;
char inchar;
int i;
inputFile = fopen("code.txt", "r");
//check file
if (inputFile == NULL){
printf("Failed to open\n");
return 0;
}else{
//inputFile is valid so I read a string
//and store it in inputBuffer
fgets(inputBuffer, 80, inputFile);
//pass every character of inputBuffer to encrypt()
for(i=0; i<strlen(inputBuffer); i++){
encrypt(inputBuffer[i]);
}
}
printf("\n\n");
return 0;
}
我没有对字符格式(大写,仅限字母数字,ecc ...)实施任何控制,您可以轻松更改加密算法。