我需要格式化输出而不破坏我的加密算法

时间:2014-10-21 01:28:15

标签: c encryption cryptography

我正在做一个铁路密码(zigzag密码),但是你可以调用它,我似乎终于让我的代码正常工作了,我得到它打印正确的输出,但不幸的是我的老师要求打印输出80列宽(每行80个字符)。不幸的是,我的加密设置方式我找不到办法,因为我设置加密"铁路轨道"。

对于赋值,我们必须读入文件,并删除所有空格和特殊字符,并将所有大写字母设置为小写。然后加密消息。我的问题是加密功能中的打印部分。

因为从命令行运行的是我使用的文件

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

我们不会标记或失败。我们将继续到最后。我们将在法国战斗,我们 我们将在海洋和海洋上作战,我们将以越来越大的信心和战斗来战斗 在空中不断增强的力量,我们将保护我们的岛屿,无论成本如何,我们 应该在海滩上作战,我们将在着陆场上战斗,我们将战斗 在田野和街道上,我们将在山上战斗。我们永远不会投降!

根据我的老师输出,我的输出是正确的,但不幸的是我因为没有每行80个字符而获得30%的折扣...这是在几个小时内到期但我似乎无法弄明白。任何帮助是极大的赞赏。 我会显示输出以供参考,但我不知道如何从命令行复制和粘贴,它只从那里运行。

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

1 个答案:

答案 0 :(得分:2)

简单。而不是打印每个轨道作为一个整体,按字符打印每个轨道字符,并计数。在下面的示例中,我假设您的教师每行 80个字符是79个字符的密文加一个换行符。我不知道你是否应该在密文末尾打印换行符,但如果是这样,只需在加密结束时添加printf("\n");(尽管你可能想检查至少有一个密文字符)在这之前)。

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

除此之外,我完全建议在格式化中使用更多的空格,以及检查用户是否传入两个参数,是否已成功打开文件,还记得关闭任何文件开。

结果,您的程序很难阅读,如果我不同时提供命令行参数或者我提供不存在的文件,那么目前的行为很糟糕。