未定义的标识符/未声明
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;
}
我最近开始使用 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;
}