C++ 字符串数组的奇怪内存行为

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;

我需要在一个个人项目的控制台窗口中打印一个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; 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;
}