C 我需要在不破坏加密算法的情况下格式化输出

C 我需要在不破坏加密算法的情况下格式化输出,c,encryption,cryptography,C,Encryption,Cryptography,我在做一个铁路密码(之字形密码),不管你怎么称呼它,我最终似乎让我的代码正常工作,我让它打印正确的输出,但不幸的是,我的老师要求输出打印80列宽(每行80个字符)。不幸的是,我的加密设置方式我找不到这样做的方法,因为我将加密设置为“逐轨” 对于作业,我们必须读入文件,去掉所有空格和特殊字符,并将所有大写字母改为小写。然后对消息进行加密。我的问题是加密函数中的打印部分 因为它是从命令行运行的,所以这里是我使用的文件 第一个文件指针用于rails,示例为:9 第二个文件指针是文本,我使用的示例是:

我在做一个铁路密码(之字形密码),不管你怎么称呼它,我最终似乎让我的代码正常工作,我让它打印正确的输出,但不幸的是,我的老师要求输出打印80列宽(每行80个字符)。不幸的是,我的加密设置方式我找不到这样做的方法,因为我将加密设置为“逐轨”

对于作业,我们必须读入文件,去掉所有空格和特殊字符,并将所有大写字母改为小写。然后对消息进行加密。我的问题是加密函数中的打印部分

因为它是从命令行运行的,所以这里是我使用的文件

第一个文件指针用于rails,示例为:9 第二个文件指针是文本,我使用的示例是:

我们不会失败。我们将继续到最后。我们将在法国作战,是吗 我们将在海洋上战斗,我们将以越来越大的信心和信心战斗 随着空中力量的增强,我们将保卫我们的岛屿,无论付出什么代价,我们都将 我们将在海滩上战斗,我们将在登陆场上战斗,我们将在战场上战斗 在田野和街道上,我们将在山里战斗。我们决不投降

我的输出是正确的,根据我的老师输出,但不幸的是,我得到了30%的折扣,因为它没有80个字符每行。。。几个小时后就要交了,但我似乎还没弄明白。非常感谢您的帮助。 我会显示输出以供参考,但我不知道如何从命令行复制和粘贴,它只能从那里运行

#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");
            }
        }
    }
}