C++ 不确定如何让我的程序输出空格的位置

标签 c++ string encryption

好的,所以我有两个问题,如果有人能帮助我,我将不胜感激!这是我的第一门编程课,所以这也是我的第一门 C++ 课,我有点卡住了。

所以我创建了一个凯撒密码,将用户输入的字符串向右移动 8-15 之间的伪随机数。完整的程序需要做的是在开始时给出它被移位的数字,然后是加密的字符串。如果输入的字符串中有空格,他们需要取空格之前的字母/数字并将其移动 4。我需要用“&”字符终止加密,然后是“#” ' 字符,然后是第一个空格的数字位置,后跟另一个 '#' 字符和第二个空格的另一个位置(如果有的话),依此类推。

例如,如果我正在加密一个被移动 9 的字符串并说:

Hello World 123

加密后应该是这样的:

9qnuuxsfxaumh012&#6#12
  1. 我的第一个也是更重要的问题。我无法弄清楚如何让程序输出“#”字符后跟告诉空格位置的数字。我想过也许做某种循环来读取字符串,但我一无所获。如果我能得到一些建议,那就太好了,因为这是唯一阻止我上交的部分。

  2. 我的第二个问题来自于我自己的代码中的一点困惑,我喜欢关于它如何工作的英文解释,因为我自己并不理解它。我首先只使用 for 循环来使字符 'z' 回绕到 'a' 但无论我做了什么,我一直让它只在下一个 '{' 字符之后回绕ascii 表中 'z' 之后的字符。所以我决定改变我的方法,我在维基百科的“凯撒密码”下读到你可以使用模数。所以我使用了他们给我的方程式,即 E(x) = (a + b) mod 26。好吧,它没有用。所以我开始进行谷歌搜索,看到了 2 个不同的帖子,其中人们减去字符“a”,然后在末尾重新添加字符“a”,并使用 += 将变量添加到自身。所以我把它放进去了,它起作用了。
    它看起来像这样:

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

在阅读了 wiki 后我认为它看起来像这样,但当我把它放入时它不起作用

    output = ((input[count] + n) % 26)

包装数字也是如此:

output += ((input[count] - '0' + n) % 10) + '0';

因此,如果有人可以向我解释为什么我要将输出添加到自身并在开头减去“a”,然后在末尾重新添加“a”,这样我就能理解发生了什么。我真的不喜欢在要上交的程序中包含我什至不了解自己的代码。

无论如何,我很抱歉读了这么长,我只是想我会清楚地解释发生了什么以及我需要什么,这样任何愿意提供帮助的人都会完全理解我在说什么,而无需我跟进第二个帖子解释。

最后是我编写的完整程序:

#include <ctime>
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
using namespace std;

//random number generator between 8 and 15
int random()
{
    int value;
    value = rand() % (18 - 10) + 8;
    return value;
}

int main()

{
    //Give random() a seed
    srand(time(NULL));

    //Declare variables
    string input;
    int length;
    int n = random();
    string output;

    //Program
    cout << "Enter your secret message: " << endl;
    getline (cin, input);
    cout << n;

    length = input.length();

    for (int count = 0; count < length; count++)
    {
        input[count] = tolower(input[count]);
        if (input[count] >= 'a' && input[count] <= 'z')
        {
            output += ((input[count] - 'a' + n) % 26) + 'a';
        }
        if (input[count] >= '0' && input[count] <= '9')
        {
            output += ((input[count] - '0' + n) % 10) + '0';
        }
        else if(input[count] == ' ')
        {
            if (input[count - 1] >= 'a' && input[count - 1] <= 'z')
            {
                output += ((input[count - 1] - 'a' + 4) % 26) + 'a';
            }
            else if (input[count - 1] >= '0' && input[count - 1] <= '9')
            {
                output += ((input[count - 1] - '0' + 4) % 10) + '0';
            }
            cout << output;
        }
    }
            cout << output << endl;
            return 0;   
}

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

最佳答案

二人回答第二题:

input[count] - 'a'

字母 a 为 0,字母 b 为 1,... 25 为字母 z。

input[count] - 'a' + n

然后你加上数字n。将“a”作为输入并设置为 n==2,您将得到 3。但是对于“z”作为输入,您将得到 27。

要解决您使用模数的问题:

(input[count] - 'a' + n) % 26

结果是“z”的 1。

((input[count] - 'a' + n) % 26) + 'a'

现在您将数字从 0 到 25 转回相应的 ASCII 码。

关于C++ 不确定如何让我的程序输出空格的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312671/

相关文章:

c++ - 在编译时区分 C++ 中的静态和非静态方法?

C++ 链表核心转储错误

java - java中具有可变数量参数的字符串格式

python - 如何将字符串更改为浮点列表和n维列表的 'n'?

php - AES-128 OFB 使用 mcrypt (PHP) 和 pycryptodome (Python) 的不同之处

ssl - 强制使用 ECDHE 密码的 SHA256 服务器证书

c++ - 为什么 cin 命令在缓冲区中留下 '\n'?

c++ - 禁止MAC地址访问某个端口 - C++

c++ - 用单词和数字按字母顺序排列字符串

security - 使用Fortuna PRNG :在计数器模式下使用AES进行随机访问加密