C 代码错误:分段错误[每次]
我正在编写这个C/C++程序,该程序假定可以找到不同大小数组的平均值、中值和模式。尽管如此,无论输入是什么,我总是会遇到分段错误。我的代码有什么问题?任何建议都将受到欢迎!: 代码如下:C 代码错误:分段错误[每次],c,C,我正在编写这个C/C++程序,该程序假定可以找到不同大小数组的平均值、中值和模式。尽管如此,无论输入是什么,我总是会遇到分段错误。我的代码有什么问题?任何建议都将受到欢迎!: 代码如下: #include <stdio.h> //#include <string.h> //#include <math.h> #include <stdlib.h> 主要功能: int main() { int i; scanf(" %d ",&am
#include <stdio.h>
//#include <string.h>
//#include <math.h>
#include <stdlib.h>
主要功能:
int main() {
int i;
scanf(" %d ",&i); //10
double arr[i]; //array that contains all the values and will be sortted
for (int j=0; j<i; j++) { //64630 11735 14216 99233 14470 4978 73429 38120 51135 67060
scanf(" %lf ",&arr[j]);
}
printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
return 0;
}
模式功能:
使用NumberOf函数确定重复次数最多的数组元素。返回最高等重复次数中的最低值
double mode(double arr[],int l){
int maxA;
int maxP;
for (int i=0;i<l;i++) {
int j = numberOf(arr[i],arr,l);
if (j>maxA) {
maxA = j;
maxP = i;
}
else if (j==maxA && arr[maxP]>arr[i])
maxP = i;
}
double d = arr[maxP];
return d;
}
函数编号:
模式函数的助手函数。返回具有外观值的元素数量
您的代码有一系列错误。其中一些: 在这种情况下,您不需要在scanf中使用空格。这会导致读取错误。 为了改变函数的值,不需要向函数传递数组地址。数组总是通过引用传递。因此,将函数从void-sortdouble*[],int;要使sortdouble[],int;,无效;,在函数内部进行必要的更正,并使用sortarr,l调用它;而不是排序&arr,l; min函数声明了一个未初始化的变量minP,因此该变量包含内存中的垃圾。for循环并没有同时输入这两个if条件,所以函数结束并返回仍然未初始化的变量minP。然后使用该随机值访问数组中的索引:j=min0,arr,l;min返回一个随机数,然后arr2[i]=arr[j];访问禁止的内存区域,这将导致分段错误。mode函数中的变量maxP和maxA也存在同样的问题。
访问数组时必须始终小心,不要超出其界限,并始终确保在使用它们时初始化变量。正如其他人所评论的,我也强烈建议您学习如何调试程序,因为这将有助于您分析程序的执行情况并跟踪错误。我将您的分段错误跟踪到了由median调用的排序例程。我没有修复排序,而是用库中的qsort替换,以说服自己这就是问题所在:
// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.
int comparator(const void *p, const void *q) {
double a = *((double *) p);
double b = *((double *) q);
return (a > b) - (a < b); // compare idiom
}
double median(double array[], int length) {
// sort(array, length);
qsort(array, length, sizeof(double), &comparator);
double d = array[length / 2];
if (length % 2 != 0) {
return d;
}
double dd = array[(length / 2) - 1];
return (d + dd) / 2;
}
您可能应该在以下模式中初始化变量:
一个建议是,在调试程序中运行代码。这些并不是您要寻找的错误内容,但我可以告诉您:1。您正在使用scanf。2.呃,请不要用小写L作为变量名。3.看起来你没有任何努力去隔离你的代码的哪一部分是失败的,在这种情况下,它不应该花费太多。你把问题标记为C和C++,所以我们不能告诉你在使用哪种语言/编译器,你不知道崩溃发生在哪里,所以你显然太懒了,甚至一次都没有使用过调试器。把你的代码呈现为一个我们可以编译的程序,而不是分解成一个不连贯的部分集合。编辑您的帖子,向我们展示一个我们可以编译的程序,也许我们可以帮助您。没有C/C++程序。它不可能同时用两种语言写,因为它们不是同一种语言。选择您实际使用的标签,并仅使用该标签。如果你不确定你正在使用哪一个,请远离键盘,直到你找到它为止。完成后,修复标记和文本,并包括一个将演示问题的示例。启用足够多警告的编译允许编译器提供帮助。它警告我关于minP,但也警告了maxP和maxA。我使用了gcc-O3-g-std=c11-Wall-Wextra-Werror-Wmissing原型-Wstrict原型-Wold样式定义-c mess11.c,在将其固定到int mainvoid之后。详细信息。。。scanf中的空格。这会导致读取错误。->导致问题的是格式中的尾随空格。领先者是不必要的。
static int min(double minLookingTo,double arr[],int l) {
int minP;
double minA = minLookingTo;
for (int i=0; i<l; i++) {
if (arr[i] == -1)
continue;
if (minLookingTo<=arr[i] && arr[i]<=minA) {
minP = i;
minA = arr[i];
}
}
return minP;
}
double mean(double arr[],int l){
double total = 0;
for (int i=0; i<l; i++) {
total += arr[i];
}
return total/l;
}
double median(double arr[],int l){
sort(&arr,l);
double d = arr[(l/2)+1];
double dd = arr[(l/2)];
if (l%2!=0)
return d;
return (d+dd)/2;
}
double mode(double arr[],int l){
int maxA;
int maxP;
for (int i=0;i<l;i++) {
int j = numberOf(arr[i],arr,l);
if (j>maxA) {
maxA = j;
maxP = i;
}
else if (j==maxA && arr[maxP]>arr[i])
maxP = i;
}
double d = arr[maxP];
return d;
}
int numberOf(double looking,double arr[],int l) {
int amount = 0;
for (int i=0; i<l; i++)
if (looking == arr[i])
amount++;
return amount;
}
// Median Function:
// Uses the Sort Function. Assuming that works, returns the median.
int comparator(const void *p, const void *q) {
double a = *((double *) p);
double b = *((double *) q);
return (a > b) - (a < b); // compare idiom
}
double median(double array[], int length) {
// sort(array, length);
qsort(array, length, sizeof(double), &comparator);
double d = array[length / 2];
if (length % 2 != 0) {
return d;
}
double dd = array[(length / 2) - 1];
return (d + dd) / 2;
}
printf("%.1lf\n%.1lf\n%.0lf",mean(arr,i),median(arr,i),mode(arr,i));
double mode(double array[], int length) {
int maxA = INT_MIN;
int maxP = -1;
for (int i = 0; i < length; i++) {
int j = numberOf(array[i], array, length);
if (j > maxA) {
maxA = j;
maxP = i;
} else if (j == maxA && array[maxP] > array[i]) {
maxP = i;
}
}
return array[maxP];
}