简体   繁体   English

奇怪的错误C ++ XCode-线程1:EXC_BAD_ACCESS

[英]Strange error c++ xcode - Thread 1: EXC_BAD_ACCESS

Please ignore how awfully my code is made, it's for a project and I wanted to finish as fast as possible. 请忽略我的代码制作得多么糟糕,它是针对一个项目的,我想尽快完成。 I try to run my code on xcode and I get an error I have no idea about. 我尝试在xcode上运行我的代码,但出现一个我不知道的错误。 In this program, I am supposed to import a text file with phone records and display a cost based on the information. 在该程序中,我应该导入一个带有电话记录的文本文件,并根据该信息显示费用。 The file path is correct, and I don't know what's wrong with my code to cause this error: 文件路径正确,并且我不知道导致此错误的代码出了什么问题:

https://drive.google.com/file/d/0Bysk6_x4B46uU2pmWFhRYWd6d1E/view?usp=sharing https://drive.google.com/file/d/0Bysk6_x4B46uU2pmWFhRYWd6d1E/view?usp=sharing

Here's the code: 这是代码:

//  phoneRecords.cpp
//  PhoneRecords
//
//  Created by Roei Bustein on 7/19/16.
//  Copyright © 2016 Roei Bustein. All rights reserved.
//

/*
 * This program reads records from a file and parse each
 * record into variables as it goes
 */

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iterator>

using namespace std;

string makeTimeIntoInt(string line[]) {
    string temp = "";
    string time = line[2];
    for (char a : time) {
        if (a == ':')
            continue;
        else
            temp += a;
    }

    return temp;
}

float calculateCost(string line[]) {
    int time = stoi(line[2]);
    int duration = stoi(line[3]);
    if (line[1] == "Mo" || line[1] == "Tu" || line[1] == "We" ||
        line[1] == "Th" || line[1] == "Fr") {
        if (time < 800 || time > 1800) {
            return duration * 0.25;
        } else
            return duration * 0.4;

    }

    else if (line[1] == "Sa" || line[1] == "Su") {
        return duration * 0.15;
    }

    return 0;
}

int main() {
    ifstream inputFile;
    string line;
    int cnt = 0;
    inputFile.open(
                   "/Users/roeibustein/Documents/C++ "
                   "Workspace/PhoneRecords/PhoneRecords/calls1.txt");
    string arr[18];
    string line1[3], line2[3], line3[3], line4[3], line5[3], line6[3];
    float costLine1, costLine2, costLine3, costLine4, costLine5, costLine6;

    if (inputFile.is_open()) {
        while (getline(inputFile, line)) {
            istringstream split(line);

            while (split) {
                split >> arr[cnt];
                cnt++;
                split >> arr[cnt];
                cnt++;
                split >> arr[cnt];
                cnt++;
            }
        }
    }

    line1[1] = arr[1];
    line1[2] = arr[2];
    line1[3] = arr[3];
    line2[1] = arr[4];
    line2[2] = arr[5];
    line2[3] = arr[6];
    line3[1] = arr[7];
    line3[2] = arr[8];
    line3[3] = arr[9];
    line4[1] = arr[10];
    line4[2] = arr[11];
    line4[3] = arr[12];
    line5[1] = arr[13];
    line5[2] = arr[14];
    line5[3] = arr[15];
    line6[1] = arr[16];
    line6[2] = arr[17];
    line6[3] = arr[18];

    line1[2] = makeTimeIntoInt(line1);
    line2[2] = makeTimeIntoInt(line2);
    line3[2] = makeTimeIntoInt(line3);
    line4[2] = makeTimeIntoInt(line4);
    line5[2] = makeTimeIntoInt(line5);
    line6[2] = makeTimeIntoInt(line6);

    costLine1 = calculateCost(line1);
    costLine2 = calculateCost(line2);
    costLine3 = calculateCost(line3);
    costLine4 = calculateCost(line4);
    costLine5 = calculateCost(line5);
    costLine6 = calculateCost(line6);

    cout << line1[1] << " " << line1[2] << " " << line1[3] << " " << costLine1
    << "\n";

    cout << line2[1] << " " << line2[2] << " " << line2[3] << " " << costLine2
    << "\n";

    cout << line3[1] << " " << line3[2] << " " << line3[3] << " " << costLine3
    << "\n";

    cout << line4[1] << " " << line4[2] << " " << line4[3] << " " << costLine4
    << "\n";

    cout << line5[1] << " " << line5[2] << " " << line5[3] << " " << costLine5
    << "\n";

    cout << line6[1] << " " << line6[2] << " " << line6[3] << " " << costLine6
    << "\n";

    return 0;
}

I think your error is caused by accesing an out-of-range index in table. 我认为您的错误是由于访问表中超出范围的索引引起的。 In c++ tables are indexed from 0, so when you declare string arr[18] you can not get a value by calling arr[18] . 在c ++中,表的索引从0开始,因此在声明string arr[18] ,无法通过调用arr[18]获得值。 In other words the first element is arr[0] and the last is arr[17] 换句话说,第一个元素是arr[0] ,最后一个元素是arr[17]

Your array is beyond it's bounds . 您的数组超出了范围。 Copy this code to see if it work. 复制此代码以查看其是否有效。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iterator>

using namespace std;

string makeTimeIntoInt(string line[]) {
    string temp = "";
    string time = line[1];
    for (char a : time) {
        if (a == ':')
            continue;
        else
            temp += a;
    }

    return temp;
}

float calculateCost(string line[]) {
    int time = stoi(line[1]);
    int duration = stoi(line[2]);
    if (line[0] == "Mo" || line[0] == "Tu" || line[0] == "We" ||
        line[0] == "Th" || line[0] == "Fr") {
        if (time < 800 || time > 1800) {
            return duration * 0.25;
        } else
            return duration * 0.4;

    }

    else if (line[0] == "Sa" || line[0] == "Su") {
        return duration * 0.15;
    }

    return 0;
}

int main() {
    ifstream inputFile;
    string line;
    int cnt = 0;
    inputFile.open("/Users/lhmac/abc.txt");
    string arr[18];
    string line1[3], line2[3], line3[3], line4[3], line5[3], line6[3];
    float costLine1, costLine2, costLine3, costLine4, costLine5, costLine6;

    if (!inputFile.is_open()) {
        return 0;
    }

    while (getline(inputFile, line) && cnt < 18) {
        istringstream split(line);
        split >> arr[cnt];
        cnt++;
        split >> arr[cnt];
        cnt++;
        split >> arr[cnt];
        cnt++;
    }

    inputFile.close();

    line1[0] = arr[0];
    line1[1] = arr[1];
    line1[2] = arr[2];
    line2[0] = arr[3];
    line2[1] = arr[4];
    line2[2] = arr[5];
    line3[0] = arr[6];
    line3[1] = arr[7];
    line3[2] = arr[8];
    line4[0] = arr[9];
    line4[1] = arr[10];
    line4[2] = arr[11];
    line5[0] = arr[12];
    line5[1] = arr[13];
    line5[2] = arr[14];
    line6[0] = arr[15];
    line6[1] = arr[16];
    line6[2] = arr[17];

    line1[2] = makeTimeIntoInt(line1);
    line2[2] = makeTimeIntoInt(line2);
    line3[2] = makeTimeIntoInt(line3);
    line4[2] = makeTimeIntoInt(line4);
    line5[2] = makeTimeIntoInt(line5);
    line6[2] = makeTimeIntoInt(line6);

    costLine1 = calculateCost(line1);
    costLine2 = calculateCost(line2);
    costLine3 = calculateCost(line3);
    costLine4 = calculateCost(line4);
    costLine5 = calculateCost(line5);
    costLine6 = calculateCost(line6);

    cout << line1[0] << " " << line1[1] << " " << line1[2] << " " << costLine1
    << "\n";

    cout << line2[0] << " " << line2[1] << " " << line2[2] << " " << costLine2
    << "\n";

    cout << line3[0] << " " << line3[1] << " " << line3[2] << " " << costLine3
    << "\n";

    cout << line4[0] << " " << line4[1] << " " << line4[2] << " " << costLine4
    << "\n";

    cout << line5[0] << " " << line5[1] << " " << line5[2] << " " << costLine5
    << "\n";

    cout << line6[0] << " " << line6[1] << " " << line6[2] << " " << costLine6
    << "\n";

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM