未定义的标识符/未声明

Undefined identifier/ undeclared

我最近开始使用 C++,我想创建一个可以调用的简单的 ceaser 密码函数,但是因为我从我的 python 程序中复制了编码结构,所以我似乎收到 4 个错误和 2 个警告.模式位是一个布尔值,其中 true 是加密,false 是解密(它在 python 上工作所以嘿):).

我创建 "int" 所在的函数的第一个,它说 "identifier "in" undefined"

同一行中的第二个 "expected a ')'"

第三个在 3 个 if 语句之后,说 "identifier "CharPos“未定义”,即使它已定义

和 Forth 在同一行说“'CharPos':未声明的标识符”

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

std::string Encryption(std::string Password, int Key, bool Mode) {
    std::string Alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
    std::string EncryptPass = "";
    if (Key > 36) {
        Key = Key % 36;
    }
    for (int X = 0; X < Password.length(); X++) {
        if (Password.at(X) == ' ') {
            EncryptPass = EncryptPass + " ";
        }
        else {
            for (int Y = 0; Y < 36; Y++) {
                if (Password.at(X) == Alphabet.at(Y)) {
                    if (Mode == true) {
                        int CharPos = Y + Key;
                        if (CharPos > 35) {
                            CharPos = CharPos - 36;
                        }
                    }
                    if (Mode == false) {
                        int CharPos = Y - Key;
                        if (CharPos < 0) {
                            CharPos = CharPos + 36;
                        }
                    }
                    if (Mode != true and Mode != false) {
                        int CharPos = 0;
                    }
                    char CharPos2 = CharPos;
                    char EncryptChar = Alphabet.at(CharPos2);
                    EncryptPass = EncryptPass + EncryptChar;
                }
            }
        }
    }
    return EncryptPass;
}

如有任何帮助,我们将不胜感激

你对一些变量的范围有一些问题,比如这里:char CharPos2 = CharPos; charPos 不再在范围内所以实际上是无效的作业。

因此,与其在每个 if else 中定义一个新的 CharPost,不如在之前声明它并在每个 if 检查中重新分配它,例如:

if (Password.at(X) == Alphabet.at(Y)) {
    int CharPos = 0;
    if (Mode == true) {
        CharPos = Y + Key;
        if (CharPos > 93) {
            CharPos = CharPos - 94;
        }
    }
    if (Mode == false) {
        CharPos = Y - Key;
        if (CharPos < 0) {
            CharPos = CharPos + 94;
        }
    }
    if (Mode != true or Mode != false) {
        CharPos = 0;
    }
    char CharPos2 = CharPos;
    char EncryptChar = Alphabet.at(CharPos2);
    EncryptPass = EncryptPass + EncryptChar;
}

但除此之外,您的代码已损坏...所以只有转译在这里不起作用...

看这里:

std::string Alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
...
for (int Y = 0; Y < 94; Y++) {
    if (Password.at(X) == Alphabet.at(Y)) {

(Y) 处的字母表对于高于 36 的值会爆炸...

如上所述,代码中的主要问题是每个 if 子句中都重新定义了 CharPos

你放置 int CharPos = ... 的每个地方,都会创建一个 new 变量,尽管它的名称对你来说很相似,但对于编译器来说,有三个 unique 这个名字的变量。为了在所有 scopes - 变量环境中使用同一个变量,你应该定义它 once 在所有的第一个公共范围内,也就是说,在 if - else 子句之前的 for 循环中。

此外,如上所述 Mode != true || Mode != false 等同于 true!

为了安全起见,我重写了您的代码,实现了想要的加密,并且更具可读性 (IMO)。


std::string encrypt(const std::string& word, std::size_t shift_amount, bool should_shift_up)
{
    static const std::string alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";

    assert (shift_amount <= alphabet.size()); // makes no sense having shift > alphabet size!

    std::string encrypted_word(word.size(), '[=10=]');

    for (std::size_t idx = 0; idx < word.size(); ++idx)
    {
        char original_char = word[idx];
        std::size_t pos_in_alphabet = alphabet.find(original_char);

        std::size_t shifted_char = 'a';
        if (should_shift_up)
        {
            shifted_char = (pos_in_alphabet + shift_amount) % alphabet.size();
        }
        else
        {
            shifted_char = (pos_in_alphabet > shift_amount)  
                         ? pos_in_alphabet - shift_amount
                         : alphabet.size() - shift_amount + pos_in_alphabet;
        }

        encrypted_word[idx] = alphabet[shifted_char];
    }

    return encrypted_word;
}