关于我的解密程序有2个问题,C ++出现问题

库什

所以我程序中的某些内容并没有按照我认为的方式进行。如果我能得到一些帮助,我将不胜感激。我将解释它应该如何首先工作,并从最重要的问题开始回答我的问题,因为我一直坚持下去,而且这不允许我继续前进。

因此,我编写了一个加密程序,要求用户输入一个字符串,然后对其进行加密,并创建一个名为“ secret.dat”的文件,并将加密后的短语放入其中。

如果用户输入以下短语:

hello world 123

它将发送到文件中:

11spwwzshzcwoh234&6#12

“ 11”表示字母向右移动了多少个字母。随后是他以加密形式输入的词组。“&”字符显示加密的结束位置。他的短语中的每个空格都使用前一个字母并将其移动4,最后在'&'字符之后,它告诉空格之间用数字#隔开的数字位置。

我正在编写的当前程序将解密“ secret.dat”文件,并在屏幕上显示其短语。

这是我到目前为止的内容:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    //Declare Variables
    int shift;
    ifstream inData;
    string input;
    string output;
    int length;

    //Open file
    inData.open("secret.dat");

    //Begin program
    inData >> shift;

    getline(inData, input, '&'); 

    length = input.length();

    for (int count = 0; count < length; count++)
    {
        if (input[count] >= 'a' && input[count] <= 'z')
        {
            output += ((input[count] - 'a' - shift) % 26) + 'a';
        }
        else if (input[count] >= '0' && input[count] <= '9')
        {
            output += ((input[count] - '0' - shift) % 10) + '0';
        }       
    }

    //Declare variables for location of spaces
    int i = 0;
    char ignore;
    int spaces[20];
    int location;

    //Begin finding the spaces
    while (!EOF)
    {
        inData >> location;
        spaces[i] = location;
        inData >> ignore;
    }

    //Preview each result to compare and make sure they are working right
    cout << shift << endl;
    cout << input << endl;
    cout << output << endl;
    cout << spaces[0] << endl;
    cout << spaces[1] << endl;

    return 0;
}

这就是我得到的结果

11
spwwzshzswoh234
helloh]oXld]'()
4704512
0

显然最后三行不能正常工作(注意:这不是我要显示的方式,我只是将它们打印到屏幕上,以便可以看到结果是什么,并确保它是正确的,这是不正确的。) t)。

因此,我的第一个也是最重要的问题是为什么我的while循环无法正常工作。当它应该在第一个位置放置6时,它在第一个数组插槽中给了我一堆随机数,然后它应该跳过下一个字符,然后在数组的第二个位置放置12并在其中放置0 。如果我只是在while循环之外从文件中调用一个整数,它给我6没问题,所以我不确定为什么会这样做。我认为它将第一个整数放在数组的第一个插槽中,然后跳过下一个字符,然后将下一个整数放在数组中,并跳过下一个字符,依此类推,直到文件结束。这部分是使我无法继续执行程序的原因,因此我将其视为最重要的部分。

其次,我将字符向后移动的公式有什么问题?我使用了相同的确切公式将字符向前移动到我的加密程序中,除了我添加了shift之外,因此我假设只需减去shift即可对其进行解密。

感谢任何愿意提供帮助的人!

山姆·瓦尔沙夫奇克

在您的加密方案中,字符“ h”代表明文字母“ w”。

让我们研究一下您的代码如何尝试对此进行解码:

if (input[count] >= 'a' && input[count] <= 'z')
{
    output += ((input[count] - 'a' - shift) % 26) + 'a';
}

input[count]是字符“ h”。'h'-'a'为7。您的“ shift”值为11。

您的表达式计算出(7-11)%26或-4%26。

流行测验:-4%26是多少?得知答案是-4,您会感到惊讶。在'a'上加上-4会产生字符']',这是您在输出中相应位置看到的内容。

要解决此问题,请将此行更改为:

output += ((input[count] - 'a' - shift + 26) % 26) + 'a';

并以相同方式将另一行更改为数字。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章