变量"方程"周围的堆栈已损坏

Stack around the variable 'equation' was corrupted

本文关键字:堆栈 已损坏 周围 方程 变量      更新时间:2023-10-16

我试图在vc++中制作一个计算器,即使它运行,它仍然读取我没有告诉它的内存,我不知道如何使它停止。

#include <iostream>
#include <ctype.h>
int main(){
char equation[4];
equation[3] = ''; //string terminator
int result;
bool wantsToContinue = true;
char yesOrNo;
equationPrompt:
std::cout << "Enter Equation: ";
std::cin >> equation;
while(wantsToContinue){
    switch(equation[1]){
    case '+':
        result = int(equation[0]) + int(equation[2]);
        break;
    case '-':
        result = int(equation[0]) - int(equation[2]);
        break;
    case '*':
        result = int(equation[0]) * int(equation[2]);
        break;
    case '/':
        result = int(equation[0]) / int(equation[2]);
        break;
    }
std::cout << std::endl << "Your answer is " << result << std::endl;
exitPrompt:
std::cout << "Exit? Y/N: ";
std::cin >> yesOrNo;
if(tolower(yesOrNo) == 'n'){
    wantsToContinue = true;
    goto equationPrompt;
}
else if (tolower(yesOrNo) == 'y')
    wantsToContinue = false;
else{
    std::cout << std::endl << "Unknown response." << std::endl;
    goto exitPrompt;
}
}
return 0;
}

您可以通过不编写C和c++混合的神秘的弗兰肯斯坦语言来阻止它,而是使用真正的c++字符串类型:

#include <string>
#include <istream>
#include <iostream>

int main()
{
  std::string equation;
  std::cin >> equation;
  // now equation[0] is the first character
}

注意,int(equation[0])几乎肯定不是你想的那样。你想要的是int x = std::atoi(equation[0]);std::strtol(),但这只适用于个位数。可能直接将流转换成整数要简单得多,它执行实际的文本到整数的转换:

int x, y;
std::string operand;
std::cin >> x >> operand >> y;

equation是一个包含4个char的数组。

std::cin >> equation;

将任意长的字符串读入该数组。输入太多,会溢出,占用相邻内存。

正如@Kerrek SB所说,你最好使用std::string,它没有这个问题。