c - 为什么我在这里遇到段错误 (C)

标签 c arrays segmentation-fault

我在 array[j]=array[j]+1 行中不断遇到段错误。 我已经包含了用于调用“模式”的主函数部分,这是我遇到问题的函数。该程序应该以字符串的形式获取用户输入。根据字符串的含义,函数会执行不同的操作。对于输入“模式”,它从用户处获取一个数组,然后查找最常出现的模式或数字。该程序可能不是最干净或最有效的,但我只是需要它工作。感谢您的帮助。

int mode(int input[]){
int array[30]={0},i=0,j=0,i2=0,j2=0;

while (input[i]!='\0'){
    j=input[i];
    array[j]=array[j]+1;
    i++;
    }

while (array[i2]!='\0'){
    if (array[i2]>j2){
        j2=array[i2];
        i2++;
    }
    else{
    i2++;
    }
}
return j2;
}


int main(){
char function_called[7];
int nums_for_mode[50],num_for_primes;
int num1,den1,num2,den2;


printf("Please choose a function (mode, primes, or fradd): ");
scanf("%s",&function_called);

if(strcmp(function_called, "mode")==0){
printf("\nPlease provide numbers between 1 and 30: ");
scanf("%i",&nums_for_mode);
printf("\nThe mode is %i\n",mode(nums_for_mode));
}

最佳答案

nums_for_mode未初始化,您也不终止它。

在main顶部附近,将nums_form_mode的每个成员设置为0:

    for(int a = 0; a < 50; a++)
            nums_for_mode[a] = 0;

或者,在声明点用 ={0} 对其进行初始化。修复此问题将阻止您的段错误,但程序仍然错误:

  • 您还应该循环获取数字,目前,您的程序实际上只接收一个数字。

  • array[30] 很容易溢出,包括输入 30。至少应该将其延长一倍,并且在读取时检查输入是否确实在范围内。

  • function_called 缓冲区太小,容易溢出,应限制调用 scanf 时输入的大小。

  • 这一行:while (array[i2]!='\0')没有太多逻辑意义,它会提前终止而不实际检查输入。

关于c - 为什么我在这里遇到段错误 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20013083/

相关文章:

c - 如何使用 "$gcc test.c -o demo"命令编译简单的C代码?

python - 用于处理大整数的多个数字数组

java - 旋转用整数 0-15 初始化的 4x4 数组的指定行的方法?

c++ - std::list 的迭代器中的段错误

c - 不同的逻辑地址

c - 使用stat获取最近修改的目录

Python 生成具有唯一词法元素的列表

c - 使用 strlen 时出现段错误

c++ - 如何使用静态成员函数创建一个矩阵,然后可以使用运算符重载打印该矩阵?

c - 它在 GCC 源代码的哪个位置编译成不同的汇编语言?