c ++超出内存位置错误的范围

时间:2013-10-01 19:20:48

标签: c++ memory

这是我拥有的编程任务代码。我运行程序时遇到此错误 “STRUCT2.EXE中0x772BC41F处的未处理异常:Microsoft C ++异常:内存位置0x0043ED04处的std :: out_of_range。”如果我理解正确,则错误意味着我的数组已超出分配的内存空间。那是对的吗?如果这是正确的,我做错了什么?我的输入文件中包含的元素少于30个。

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cmath>
#include <sstream>
#include <cctype>
 using namespace std;

struct Element
{
string Name;
char eN1;
char eN2;
float Weight;
};

struct Formula
{
char Element1;
char ElementA;
int Atom;
 };

void ELEMENTS(Element ElmAry[30]);
float Str2Float(string Weight);
void FORMULAS(Formula FormAry[30]);
float CalculateMoleculeWeight(Element ElmAry[30], Formula FormAry[30]);

int main()
{
ifstream inputFile1;
ifstream inputFile2;
ofstream outputFile;

inputFile1.open("Element.txt");
inputFile2.open("Formula.txt");
outputFile.open("Molecular Weight.txt");

Element ElmAry[30];
Formula FormAry[30];
char inputCh;
int i = 0;
string String1;
string mFor;
string ABRV;
int ElmDigit = 0;
float StringWeight = 0;
string Name;
string Weight;
int LENGTH = 0;
float MOLEWT;


if(!inputFile1)
{
    cout << "Couldn't find the Element.txt file." << endl;
    return 0;
}

if(!inputFile2)
{
    cout << "Couldn't find the Formula.txt file." << endl;
    return 0;
}

ELEMENTS(ElmAry);

while(inputFile1)
{
    Name = String1.substr(0,2);
    ElmAry[i].Name = Name;

    Weight = String1.substr(3,10);
    String1.clear();
    StringWeight = Str2Float(Weight);
    ElmAry[i].Weight = StringWeight;
    i++;
}
i--;

FORMULAS(FormAry);

while (inputFile2)
{
    getline(inputFile2,String1);
    LENGTH = String1.length();
    int j = 0;
    int n = 0;
    while( j < LENGTH)
    {
        int pos = 0;
        pos = String1.find(')');
        while(n < LENGTH)
        {
            inputCh = String1.at(n);
            if(isalpha(inputCh) && isupper(inputCh))
            {
                FormAry[j].Element1 = String1.at(n);
                n++;
                inputCh = String1.at(n);
            }

            if(isalpha(inputCh) && islower(inputCh))
            {
                FormAry[j].ElementA = String1.at(n);
                n++;
                inputCh = String1.at(n);
            }

            if(ispunct(inputCh))
            {
                n++;
                inputCh = String1.at(n);
                ElmDigit = (inputCh-'0');
            }

            if(isdigit(inputCh))
            {
                FormAry[j].Atom = ElmDigit;
                n++;
            }
            inputCh = String1.at(n);

            j++;

            if(iscntrl(inputCh))
            {
                n++;
                inputCh = String1.at(n);
                j++;
            }
            n++;
        }
    }
}

MOLEWT = CalculateMoleculeWeight(ElmAry, FormAry);

cout << "\t\t MOLECULAR WEIGHT CHART \t\t\n" << endl;
cout << "\n| FORMULA |\t " << "\t| ATOM.WT |" << endl;
cout << "_______________________________";
outputFile << "\t\t MOLECULAR WEIGHT CHART \t\t\n" << endl;
outputFile << "\n| FORMULA |\t " << "\t| ATOM.WT |" << endl;
outputFile << "_______________________________";

for (int a = 0; a < 30; a++)
{
    cout << MOLEWT << endl;
    outputFile << MOLEWT << endl;
}

inputFile1.close();
inputFile2.close();
outputFile.close();
cin.get();
cin.get();
return 0;
}

void ELEMENTS(Element ElmAry[30])
{
for(int i = 0; i < 30; i++)
{
    ElmAry[i].Weight = 0;
}
}

void FORMULAS(Formula FormAry[30])

{
for(int x = 0; x < 30; x++)
{
    for(int x = 0; x < 9; x++)
    {
        FormAry[x].Atom = 1;
    }
}

}

float Str2Float (string x)
{
    stringstream ss(x);
    float StringWeight;
    ss >> StringWeight;
    return StringWeight;
}

float CalculateMoleculeWeight(Element ElmAry[30], Formula FormAry[30])
{
int i;
int j=0;
float MoleWT = 0;
float MoleSum = 0;
char e1;
char e2;
char f1;
char f2;

    for(i = 0; i < 30; i++)
    {
        f1 = FormAry[j].Element1;
        f2 = FormAry[j].ElementA;
        e1 = ElmAry[i].eN1;
        e2 = ElmAry[i].eN1;
        if
            (e1 == f1 && e2 == f2)
    {
        MoleWT = ElmAry[i].Weight * FormAry[j].Atom;
        MoleSum = MoleSum + MoleWT;
        j++;
    }
}
return MoleSum;
}

当我到达

 while(inputFile1)
 {
    Name = String1.substr(0,2);
    ElmAry[i].Name = Name;

    Weight = String1.substr(3,10);//invalid string position
    String1.clear();
    StringWeight = Str2Float(Weight);
    ElmAry[i].Weight = StringWeight;
    i++;
}
i--;

Weight = String1.substr(3,10);给我一个无效的字符串位置

1 个答案:

答案 0 :(得分:4)

当您尝试访问已分配的空间(在STL容器中)之外的内存时,

std::out_of_range是一个例外。在这种特殊情况下,您正在访问尚未分配的std::string区域:

Weight = String1.substr(3,10); // empty string or string.length() < 4 throws here

std::string::substr获取必须在std::string封装的数组范围内的索引参数。如果字符串长度仅为2个字符,并且您尝试从第4个位置开始获取字符,则会看到std::out_of_range异常。在进行此类操作之前,您应该检查length

此外,您要声明您的阵列:

Element ElmAry[30];
Formula FormAry[30];

但是你循环遍历整个文件(可能有超过30个元素)。因此,当i >= 30时,您将超出界限(并且行为将是未定义的)。

您可以使用std::vector来修复此问题,这将允许数组动态调整大小或其他集合(例如std::liststd::deque)。