我是在需要打印控制台窗口内的V @ genere广场参加一个个人项目,但我遇到了一些问题,打印功能,因为它偷偷内其他类的记忆,并打印出的字符串从他们的到来.
对于那些不知道什么是Vigenere广场的人来说,这是一张照片
这是我的代码:
static void square() {
string cipher[27];
cipher[0] = " | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
for (int i = 0; i < 26; i++) {
string tmp = (char)(i + 'A') + " |";
for (int j = 0; j < 26; j++) {
tmp += " " + (char)(((j + i) % 26) + 'A');
}
cipher[i + 1] = tmp;
}
for (int i = 0; i < 27; i++) cout << cipher[i] << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的方法是使用for循环逐个创建每个字符串,循环增加行的字母ascii值,另一个为每个颜色移动1的字符串.这是奇怪的输出:
我单独运行此代码,但它"Invalid Option! Press any key to dismiss." 从我以前用于创建菜单的类中窃取了字符串.我认为这是如何访问保留给该类的部分内存.我究竟做错了什么?
问题在于这两行:
string tmp = (char)(i + 'A') + " |";
tmp += " " + (char)(j + i + 'A');
Run Code Online (Sandbox Code Playgroud)
首先评估赋值的右侧,然后才用于构造赋值的结果std::string.字符串文字通常一起存储在程序的某个静态存储器中.在程序中,文字具有指向该存储器的指针的值.单个字符基本上是一个数字.虽然+ plus运算符用于连接事物std::string,但它对指针和数字的行为却不同.如果添加char到char*你的情况,以程序的某些其他字符串-指针(或任何指针),它只是指向指针到一个不同的地方.
要打破它:
(char)(i + 'A') + " |"假设i = 0并" |"存储在例如0xabcd1234:(char)(0 + 65) + (char*)0xabcd1234(char)65 + (char*)0xabcd1234(char*)0xabcd1275 - oops,我们没有构造一个连接的字符串,我们创建了指向一些随机内存的指针!您可以通过多种方式编写程序.最小的变化是这样的:
string tmp = (char)(i + 'A') + string(" |");
tmp += string(" ") + (char)(j + i + 'A');
Run Code Online (Sandbox Code Playgroud)
这意味着 - 确保+运算符的至少一侧实际上是std::string.