2013-11-16 15 views
0

Я продолжаю получать ошибку сегментации в линейном массиве [j] = array [j] +1. Я включил часть основной функции, используемой для вызова «режима», функции, с которой я столкнулся. Предполагается, что программа принимает пользовательский ввод в виде строки. В зависимости от того, что говорит строка, функция выполняет разные вещи. Для входного «режима» он берет массив у пользователя, а затем находит режим или число, которое появляется чаще всего. Программа может быть не самой чистой или самой эффективной, но мне просто нужно ее работать. Спасибо за любую помощь.Почему я получаю ошибку сегментации здесь (C)

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)); 
} 
+2

Unrelated: Сколько элементов 'char', по вашему мнению, необходимо для хранения строки« простые »? Подсказка: его * больше * чем 6. – WhozCraig

+1

_scanf ("% i", & nums_for_mode) _ выглядит подозрительно. ваше сканирование целого числа на адрес по адресу int – amdixon

ответ

0

nums_for_mode не инициализирована, а не прекратить его либо.

В верхней части главной, устанавливается каждый член nums_form_mode 0:

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

или инициализировать его с = {0} в точке декларации. Закрепление это остановит свой Segfault, но программа еще не так:

  • Вы должны также получить номера в цикле, в настоящее время, ваша программа только на самом деле получает один номер.

  • массив [30] будет легко переполняться, в том числе, если вы введете 30. Вы должны сделать это как можно дольше, а также проверить, что входной сигнал находится в диапазоне при чтении.

  • Буфер функции_called слишком мал и подвержен переполнению, вы должны ограничить размер ввода в вызове scanf.

  • Эта строка: while (array[i2]!='\0') не имеет большого логического смысла, она прекратится раньше, не проверяя при этом вход.

+0

Большое вам спасибо за вашу помощь. Сейчас я работаю над этим. Я беру свой первый курс программирования, поэтому я делаю много небольших ошибок. Еще раз, спасибо за помощь! – JustAGuy

+0

Так почему же не работает (array [i2]! = '\ 0') и как бы закончить циклы? – JustAGuy

+0

Это проверка значения, вы должны считать длину. Поскольку этот массив имеет длину 30 элементов, вы должны проверить все тридцать элементов, выполнив 'for (int place = 0; place <30; place ++) {/ * check array [place] * /' и верните максимальное значение, которое вы найдете там , –

Смежные вопросы