围绕变量";名称“;已损坏C++; 我试图使用cSnc++在C++中完成繁杂的任务,例如从提供的名称中删除所有元音。但是,我似乎不明白为什么会出现这样的错误:

围绕变量";名称“;已损坏C++; 我试图使用cSnc++在C++中完成繁杂的任务,例如从提供的名称中删除所有元音。但是,我似乎不明白为什么会出现这样的错误:,c++,stack,c-strings,C++,Stack,C Strings,变量“name”周围的堆栈已损坏 为什么会这样 代码如下: #include <iostream> #include <iomanip> #include <cstring> #include <string> using namespace std; void cStringDemo(); void stringDemo(); void removeCVowels(char myGuess[50]); int mai

变量“name”周围的堆栈已损坏

为什么会这样

代码如下:

#include <iostream>
#include <iomanip>
#include <cstring>
#include <string>

using namespace std;

    void cStringDemo();
    void stringDemo();
    void removeCVowels(char myGuess[50]);

int main() {
    cStringDemo();
    cin.get();
    cin.ignore();
}


void cStringDemo() {
    char name[] = "Seth Smith";
    char guess[50];
    cout << "Guess my name! [First and Last, EX: Bobby Hall.]" << endl;
    cin.get(guess, 20);
    if (strcmp(name, guess) == 0) {
        cout << "Correct!" << endl;
    }
    else {
    cout << "Incorrect!" << endl;
    }
    cout << "You guessed " << guess << "." << endl;

    removeCVowels(guess);

}

void removeCVowels(char myGuess[50]) {
    char nameNoVowel[50];
    strcpy_s(myGuess, 100, nameNoVowel);
    for (int x = 0; x < 50; x++) {
        if (nameNoVowel[x] == 'a' || nameNoVowel[x] == 'e' || nameNoVowel[x] == 'i' || nameNoVowel[x] == 'o' || nameNoVowel[x] == 'u' || nameNoVowel[x] == 'A' || nameNoVowel[x] == 'E' ||
        nameNoVowel[x] == 'I' || nameNoVowel[x] == 'O' || nameNoVowel[x] == 'U')
    {
        nameNoVowel[x] = ' ';
    }
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
void cStringDemo();
void stringDemo();
void-removecodels(char-myGuess[50]);
int main(){
cStringDemo();
cin.get();
cin.ignore();
}
void cStringDemo(){
字符名[]=“Seth Smith”;
字符猜测[50];

cout这是未定义的行为:

void removeCVowels(char myGuess[50]) {
    char nameNoVowel[50];
    strcpy_s(myGuess, 100, nameNoVowel);
您正在从未初始化的
namenovyWel
复制到
myGuess
。您应该交换
strcpy\u s
的参数。此外,即使交换
strcpy\u s
的两个参数,100的限制也太大,因为namenovyWel只有50个字符。请尝试:

void removeCVowels(char myGuess[50]) {
    char nameNoVowel[50];
    strcpy_s(nameNoVowel, sizeof(nameNoVowel)-1, myGuess);

您发布的代码中存在一些问题。以下代码已修复,并在注释中解释了错误:

void cStringDemo() {
    char name[] = "Seth Smith";
    char guess[50] = {0};  //in here initialize the table with zeros
    cout << "Guess my name! [First and Last, EX: Bobby Hall.]" << endl;
    cin.get(guess, 20); // I am not sure why you want 20 characters and have array of size 50
    if (strcmp(name, guess) == 0) {
        cout << "Correct!" << endl;
    }
    else {
    cout << "Incorrect!" << endl;
    }
    cout << "You guessed " << guess << "." << endl;

    removeCVowels(guess);

}

void removeCVowels(char myGuess[50]) {
    char nameNoVowel[50] = {0}; //it is always good to initialize variables
    strcpy_s(myGuess, 50, nameNoVowel); //here lies the problem you tried to copy 100
                                        // characters from array size of 50 this leads 
                                        //to undefined behaviour of your program and stack corruption
    for (int x = 0; x < 50; x++) {
        if (nameNoVowel[x] == 'a' || nameNoVowel[x] == 'e' || nameNoVowel[x] == 'i' || nameNoVowel[x] == 'o' || nameNoVowel[x] == 'u' || nameNoVowel[x] == 'A' || nameNoVowel[x] == 'E' ||
        nameNoVowel[x] == 'I' || nameNoVowel[x] == 'O' || nameNoVowel[x] == 'U')
    {
        nameNoVowel[x] = ' ';
    }
    }
}
void cStringDemo(){
字符名[]=“Seth Smith”;
char guess[50]={0};//在这里用零初始化表

它不是到处都说
猜测值是50,但是你
strcpy
100-这是故意的吗?而且,
cin.ignore();
main()
的末尾有点多余。除了卡巴努斯已经说过的,在你的
cin.get()中
您只在50个字符的大数组中写入20个字符。这会导致您稍后(在for循环中)寻址未初始化的数据,可能会导致损坏(您可能在
strcmp_s()
中也会这样做)请注意,“另一个问题”是问题,您的其他备注是(很好,有根据)改进建议。顺便说一句,为了保持一致性,您可能已经为
nameNoVowel
提出了
={0}
初始化,它可能有助于防止UB;-)@Christophe谢谢您的评论我编辑了答案:)