【问题标题】:C++: Getting a Segmentation Fault when I run my Program (inputting numbers from a file into arrays)C++:运行程序时出现分段错误(将文件中的数字输入数组)
【发布时间】:2013-12-08 20:02:54
【问题描述】:

我正在尝试从文本文件中输入数字。我需要做的是将数字排序到一个存储奇数的数组中,以及一个存储偶数的数组中。从那里,我只需要输出平均值、总计、最小值、最大值,然后是数组中大于平均值的数字。

根据研究,我的理解是 seg.由于内存分配问题而发生故障。我检查了我的数组,我认为应该没有问题。文件中的数字总数为 50,因此应该有空间容纳数字,以及我在 main 开头为数组分配的空间。

这是我的输入文件:

46 30 82 90 56 17 95 16 48 26 4 58 0 78 92 60 12 21 63 47 19 41 90 85 14 -9 52 71 79 16 80 51 95 102 34 10 79 95 61 92 89 88 66 64 92 63 66 64 39 5

顺便说一句,我正在使用 Linux。

#include <iostream>
#include <fstream>

using namespace std;

void oddOrEven(int [], int [], int [], ifstream &, int &, int &, int &);
void calcData(int [], int [], double &, double &, double &, double &, double &, int &, 
int &);

int main()
{

int i;
int a;
int b;
double totalEven = 0;
double totalOdd;
double average = 0;
double max = 0;
double min = 0;
int array[75] = {0};
int evenArray[50] = {0};
int oddArray[50] = {0};

ifstream fileIn;

fileIn.open("file.txt");

if (!fileIn){
cout << "\nError, could not open file.\n";
}

oddOrEven(array, evenArray, oddArray, fileIn, i, a, b);

calcData(evenArray, oddArray, totalEven, totalOdd, average, min, max, a, b);

fileIn.close();

return 0;

}

void oddOrEven(int array[], int evenArray[], int oddArray[], ifstream & fileIn, int & i, 
int & a, int & b){

while (fileIn >> i) {

fileIn>>array[i];

if (array[i] % 2 == 0){
evenArray[a]=array[i];
a++;
}

else{

oddArray[b] = array[i];
b++;

}}}

void calcData(int evenArray[], int oddArray[], double & totalEven, double & totalOdd,  
double & average, double & min, double & max, int & a, int & b){

//Find min, max, total and average for Even Array.

for (int i = 0; i < a; i++){

totalEven += evenArray[i];

if (i = 0){
min = evenArray[i];
max = evenArray[i];
}

if (evenArray[i] < min)
min = evenArray[i];

if (evenArray[i] > max)
max = evenArray[i];

}

average = totalEven/a;

cout << "\nMinimum is " << min;
cout << "\nMaximum is " << max;
cout << "\nTotal is " << min;
cout << "\nAverage is " << average;

//Numbers higher than the average for Even Array:

for (int k = 0; k < a; k++){
if (evenArray[k] > average/2)
cout << evenArray[k] << " ";
}

//Find min, max, total and average for Odd Array.

for (int i = 0; i < a; i++){

totalOdd += oddArray[i];

if (i = 0){
min = oddArray[i];
max = oddArray[i];
}

if (oddArray[i] < min)
min = oddArray[i];

if (oddArray[i] > max)
max = oddArray[i];

}

average = totalOdd/b;

cout << "\nMinimum is " << min;
cout << "\nMaximum is " << max;
cout << "\nTotal is " << min;
cout << "\nAverage is " << average;

//Numbers higher than the average for Odd Array:

for (int k = 0; k < b; k++){
if (oddArray[k] > average/2)
cout << oddArray[k] << " ";}
}

【问题讨论】:

  • 你能缩进你的代码吗?
  • 你试过用std::vector&lt;int&gt;代替数组吗?

标签: c++ arrays segmentation-fault fstream


【解决方案1】:

您使用iab 来索引您的数组,但您从不初始化它们。

此外,if (i = 0) 应为 if (i == 0)(单个 = 是赋值,而不是比较)。

我没有仔细阅读代码。可能还有其他错误。

一些一般性建议:

  1. 当您的代码崩溃时,请在调试器中运行它。这将查明崩溃的位置,并让您检查程序的状态。这通常足以了解问题的根本原因。

  2. 使用std::vector 代替原始数组。

【讨论】:

  • 好的,我现在知道了...谢谢。我花了一分钟才明白我做错了什么。我认为仅仅因为我声明了 a、b 和 i 并通过引用传递了它们,“那个”就足够了,但你是对的。只需在该函数开始时将它们初始化为零。
  • 我仍在试图弄清楚为什么会发生这种情况,以及为什么通过引用传递还不够好,即使它被声明为零。我知道添加 i = 0, a = 0, b = 0;在“OddOrEven”函数的开头解决了我的问题,但不是为什么当我将它们传递给我的函数而不声明它们时它不会做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2013-09-13
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2015-04-15
相关资源
最近更新 更多