抱歉,如果问题标题有点不准确,那是因为这是一个非常奇特的问题。我的目标是解码使用我将在一段时间内解释的方法编码的输入字符串为纯英文文本。 编码是通过选择一个介于2和消息长度一半之间的整数nRows完成的,例如,长度为11的消息将允许nRows值在2到5的范围内。然后将消息写入网格的列中,每个网格单元格中一个字符,在每个列中nRows个字符,直到所有消息字符都被使用。这可能导致最后一列只填充了部分内容。然后逐行读取消息。 例如,如果输入消息是ALL HAIL CAESAR,nRows值为2,编码将如下所示:
A L H I A S R
L A L C E A @
在表格中,@代表一个不存在的空白字符,我只是加上它来解释下一部分 :)
我的实际问题是解码这些短语。迄今为止,我编写的代码可以解决一些问题,但是一旦空白字符(@)变得很多,代码就开始崩溃了,因为代码显然无法识别它们,算法会跳过它们。 我的代码是:
/*
* DeConfabulons.c
* A program to Decode for the Confabulons
*
* August 9th 2015
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
//A simple function confab which given input text encoded using
//the Confabulons encoding scheme, and a number of rows, returns
//the originally encoded phrase.
void deconfab(const char inText[], int nRows, char outText[])
{
int count = 0;
int i = 0;
int len = strlen(inText);
float help = ((float)len/(float)nRows);
int z = 0;
while (z < round(help))
{
while (((int)inText[count] > 0) && (count <= len))
{
outText[i] = inText[count];
i ++;
if (count < (int)help)
{
count = count + round((int)help+0.5);
}
else
{
float helper = count + help;
count = round(helper);
}
}
z ++;
count = z;
}
outText[i] = '\0';
}
下面介绍的方法适用于之前提到的凯撒加密算法。它的编码形式是ALHI ASRL ALCEA。我拿到的那个问题的主要输入为:
char buffer[40] = {'\0'};
deconfab("ALHI ASRL ALCEA", 2, buffer);
printf("%s\n", buffer);
正确输出的是:
ALL HAIL CAESAR
然而,当处理带有额外“空格”字符的情况时,例如:
char buffer[60] = {0};
char* s = "Two hnvde eo frgqo .uxti hcjeku mlbparszo y";
deconfab(s, 13, buffer);
printf("%s\n", buffer);
输出应该是:
The quick brown fox jumps over the lazy dog.
然而我的代码将返回:
Thdefq.the browneorouickmps ov g x julazy
我经过多次手动测试,得出结论是最后一列的空格字符导致了这个问题,然而无论我尝试什么,代码都不能在每个测试用例中正常工作。我可以几乎任意编辑大部分函数,但是任何输入或者int main(void)中的内容都不允许编辑。我只是想找到一种方法将这些空格字符识别为实际不存在的字符。