Стек вокруг переменной "имя" был поврежден C ++ - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь использовать 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] = ' ';
    }
    }
}

Ответы [ 2 ]

1 голос
/ 20 марта 2019

В коде, который вы разместили, есть несколько проблем.Ниже приведен код с пояснениями в комментариях о том, что было не так:

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] = ' ';
    }
    }
}
1 голос
/ 20 марта 2019

Это неопределенное поведение:

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

Вы копируете из неинициализированного nameNoVowel в myGuess.Вам следует поменять местами аргументы strcpy_s.Кроме того, даже если вы поменяете местами два аргумента strcpy_s, предел в 100 также слишком велик, поскольку nameNoVowel составляет всего 50 символов.Попробуйте:

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