C++ 字符串数组的奇怪内存行为
我需要在一个个人项目的控制台窗口中打印一个Vigenere square,但是我遇到了打印函数的一些问题,因为它会潜入其他类的内存并打印出来自它们的字符串 对于那些不知道什么是维格纳广场的人,这里有一个 这是我的密码:C++ 字符串数组的奇怪内存行为,c++,arrays,C++,Arrays,我需要在一个个人项目的控制台窗口中打印一个Vigenere square,但是我遇到了打印函数的一些问题,因为它会潜入其他类的内存并打印出来自它们的字符串 对于那些不知道什么是维格纳广场的人,这里有一个 这是我的密码: 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;
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;
}
static void square(){
字符串密码[27];
密码[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”;
对于(int i=0;i<26;i++){
字符串tmp=(char)(i+'A')+“|”;
对于(int j=0;j<26;j++){
tmp+=”+(char)((j+i)%26)+“A”);
}
密码[i+1]=tmp;
}
对于(inti=0;i<27;i++)cout来说,您将string
和char
混合在一起,这可能不是您的意图。我还假设您使用的是std::string
您应该使用字符数组或字符串,而不是创建字符串数组
例如
问题在于这两行:
string tmp = (char)(i + 'A') + " |";
tmp += " " + (char)(j + i + 'A');
首先计算赋值的右侧,然后计算用于构造std::string
的结果。字符串文本通常一起存储在程序的某个静态内存中。在程序中,该文本具有指向该内存的指针值。单个字符基本上是一个数字。而+plus运算符用于将事物与std::string
连接起来,它对指针和数字的行为不同。如果将char
添加到char*
指针(或任何指针),它只会将指针指向不同的位置-在您的情况下,指向程序的其他字符串
要分解它:
(char)(i+'A')+“|”
假设i=0
和“|”
存储在0xabcd1234
上:
(字符)(0+65)+(字符*)0xabcd1234
(char)65+(char*)0xabcd1234
(char*)0xabcd1275
-哎呀,我们没有构造一个具体的字符串,我们创建了指向一些随机内存的指针
有许多方法可以编写程序。最小的更改量如下:
string tmp = (char)(i + 'A') + string(" |");
tmp += string(" ") + (char)(j + i + 'A');
这意味着-确保+运算符的至少一侧实际上是std::string
代码中的主要问题是,您认为通过将空字符串与字符串联,将自动变成字符串,这是错误的(这意味着指向空字符串的某个副本的指针,由c的数值推进(这肯定不是您想要的);>>引自此处:)
最终代码可能如下所示:
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="";
tmp+=(char)(i + 'A');
tmp+=" |";
for (int j = 0; j < 26; j++) {
tmp += " ";
tmp+=(char)(j + i + 'A');
}
cipher[i + 1] = tmp;
}
for (int i = 0; i < 27; i++) cout << cipher[i] << endl;
}
void square(){
字符串密码[27];
密码[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”;
对于(int i=0;i<26;i++){
字符串tmp=“”;
tmp+=(字符)(i+'A');
tmp+=“|”;
对于(int j=0;j<26;j++){
tmp+=”;
tmp+=(char)(j+i+'A');
}
密码[i+1]=tmp;
}
对于(int i=0;i<27;i++)难道您没有提供足够的代码来解决这个问题。(char)(i++'A')+“|”
不会将char和字符串文字连接起来。您可能会感兴趣:
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="";
tmp+=(char)(i + 'A');
tmp+=" |";
for (int j = 0; j < 26; j++) {
tmp += " ";
tmp+=(char)(j + i + 'A');
}
cipher[i + 1] = tmp;
}
for (int i = 0; i < 27; i++) cout << cipher[i] << endl;
}