首页 > 解决方案 > 围绕变量“名称”的堆栈已损坏 C++

问题描述

我正在尝试使用 CStrings 在 C++ 中执行其他任务,例如从提供的名称中删除所有元音。但是,我似乎无法弄清楚为什么会出现此错误:

变量“名称”周围的堆栈已损坏。

为什么会这样?

这是代码:

#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] = ' ';
    }
    }
}

标签: c++stackc-strings

解决方案


这是未定义的行为:

void removeCVowels(char myGuess[50]) {
    char nameNoVowel[50];
    strcpy_s(myGuess, 100, nameNoVowel);

您正在从未初始化复制nameNoVowelmyGuess. 您应该交换strcpy_s. 此外,即使交换 的两个参数strcpy_s,100 的限制也太大了,因为 nameNoVowel 只有 50 个字符。尝试:

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

推荐阅读