我正在做一个铁路密码(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;
}
答案 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");
}
}
}
}
除此之外,我完全建议在格式化中使用更多的空格,以及检查用户是否传入两个参数,是否已成功打开文件,还记得关闭任何文件开。
结果,您的程序很难阅读,如果我不同时提供命令行参数或者我提供不存在的文件,那么目前的行为很糟糕。