C 我需要在不破坏加密算法的情况下格式化输出
我在做一个铁路密码(之字形密码),不管你怎么称呼它,我最终似乎让我的代码正常工作,我让它打印正确的输出,但不幸的是,我的老师要求输出打印80列宽(每行80个字符)。不幸的是,我的加密设置方式我找不到这样做的方法,因为我将加密设置为“逐轨” 对于作业,我们必须读入文件,去掉所有空格和特殊字符,并将所有大写字母改为小写。然后对消息进行加密。我的问题是加密函数中的打印部分 因为它是从命令行运行的,所以这里是我使用的文件 第一个文件指针用于rails,示例为:9 第二个文件指针是文本,我使用的示例是: 我们不会失败。我们将继续到最后。我们将在法国作战,是吗 我们将在海洋上战斗,我们将以越来越大的信心和信心战斗 随着空中力量的增强,我们将保卫我们的岛屿,无论付出什么代价,我们都将 我们将在海滩上战斗,我们将在登陆场上战斗,我们将在战场上战斗 在田野和街道上,我们将在山里战斗。我们决不投降 我的输出是正确的,根据我的老师输出,但不幸的是,我得到了30%的折扣,因为它没有80个字符每行。。。几个小时后就要交了,但我似乎还没弄明白。非常感谢您的帮助。 我会显示输出以供参考,但我不知道如何从命令行复制和粘贴,它只能从那里运行C 我需要在不破坏加密算法的情况下格式化输出,c,encryption,cryptography,C,Encryption,Cryptography,我在做一个铁路密码(之字形密码),不管你怎么称呼它,我最终似乎让我的代码正常工作,我让它打印正确的输出,但不幸的是,我的老师要求输出打印80列宽(每行80个字符)。不幸的是,我的加密设置方式我找不到这样做的方法,因为我将加密设置为“逐轨” 对于作业,我们必须读入文件,去掉所有空格和特殊字符,并将所有大写字母改为小写。然后对消息进行加密。我的问题是加密函数中的打印部分 因为它是从命令行运行的,所以这里是我使用的文件 第一个文件指针用于rails,示例为:9 第二个文件指针是文本,我使用的示例是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
# define MAX 10000
void condense(char* str)
{
int original=0;
int newplace =0;
while (str[original] != '\0')
{
if(isalpha(str[original] ))
{
str[newplace]= tolower(str[original]);
++newplace;
}
++original;
}
str[newplace] = '\0';
}
char * deblank(char *str)
{
char *out = str, *put = str;
for(; *str != '\0'; ++str)
{
if(*str != ' ')
*put++ = *str;
}
*put = '\0';
return out;
}
void encrypt(int rail,char *plain)
{
char railfence[rail][MAX],buf[2];
int i;
int number=0,increment=1;
buf[1]='\0';
for(i=0;i<rail;i++)
railfence[i][0]='\0';
for(i=0;i<strlen(plain);i++)
{
if(number+increment==rail)
increment=-1;
else if(number+increment==-1)
increment=1;
buf[0]=plain[i];
strcat(railfence[number],buf);
number+=increment;
}
for(i=0;i<rail;i++)
printf("%s",railfence[i]);
}
int main(int argc, char *argv[])
{
int rail,mode;
char text[MAX];
FILE* fp1;
FILE* fp2;
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "r");
int key;
fscanf(fp1, "%d", &key);
printf("key is %d", key);
char c;
int index = 0;
fgets(text, 10000, fp2);
printf("%s \n", text);
// text[index] = '0';
char nospace[MAX];
deblank(text);
printf("text deblanked: %s \n", text);
//printf("%s", deblank(text));
condense(text);
printf("\nthe text condensed is: %s", text);
printf("\n the text encrypted is \n");
encrypt(key,text);
return 0;
}
#包括
#包括
#包括
#包括
#定义最大10000
空冷凝(字符*str)
{
int原始值=0;
int newplace=0;
而(str[original]!='\0')
{
如果(isalpha(str[原件])
{
str[newplace]=tolower(str[original]);
++新居;
}
++原创;
}
str[newplace]='\0';
}
char*deblank(char*str)
{
字符*out=str,*put=str;
对于(;*str!='\0';++str)
{
如果(*str!='')
*put++=*str;
}
*put='\0';
返回;
}
无效加密(整型轨道,字符*普通)
{
char railfence[rail][MAX],buf[2];
int i;
整数=0,增量=1;
buf[1]='\0';
对于(i=0;i简单。不要将每个轨道作为一个整体打印,而是逐个字符打印每个轨道字符,然后计数。在下面的示例中,我假设您的讲师每行80个字符是79个密文字符加上一个换行符。我不知道您是否希望在密文末尾打印一个换行符,但如果是这样,只需添加printf(“\n”);
(不过在执行此操作之前,您可能需要检查密文中是否至少有一个字符)
void加密(int-rail,char*plain)
{
char railfence[rail][MAX],buf[2];
int i,col=0,j,len;//添加了col,j和len
整数=0,增量=1;
buf[1]='\0';
对于(i=0;iLooks good+1)。如果(col!=0)printf(“\n”),则可能需要最终的
在循环之后。除非我错过了,否则OP的代码不会打印出来,我也不会。不过,我添加了一条关于这一点的注释。这肯定有效,谢谢!除了你的假设被取消外,我实际上需要80个字符,然后是新行。我是否只需要将79改为80?@Iskarjaraki这就是我陈述我的假设的原因。是的,只需将79改为80。嘿,所以我哈哈我把if(++col==79)部分的值从79改为80,但现在我在每个句子之间有一行额外的内容,有没有办法避免这个问题?如果我把它放回79@IskarJarak,它就会恢复正常
void encrypt(int rail,char *plain)
{
char railfence[rail][MAX],buf[2];
int i, col = 0, j, len; // added col, j, and len
int number=0,increment=1;
buf[1]='\0';
for(i=0;i<rail;i++)
railfence[i][0]='\0';
for(i=0;i<strlen(plain);i++)
{
if(number+increment==rail)
increment=-1;
else if(number+increment==-1)
increment=1;
buf[0]=plain[i];
strcat(railfence[number],buf);
number+=increment;
}
for(i=0;i<rail;i++)
{
len = strlen(railfence[i]); // get the length of the rail
for(j=0;j<len;++j) // for each char in the rail
{
printf("%c", railfence[i][j]);
if (++col==79) {
col = 0;
printf("\n");
}
}
}
}