2016-01-19 3 views
-2

У меня проблема с моим кодом. Он должен принимать от количества пользователей количество в массиве, и пользователь должен написать номер, который он хочет, в диапазоне 1-100.Сбой программы C во время ввода переменных

Также программа должна отображать наименьшее и самое большое число. Если я хочу иметь массив с более чем 7 номерами, он сбрасывается при вводе чисел.

Каждый раз, когда дело доходит до номера 7, программа выходит из строя. Я понятия не имею, почему он не работает.

#include <stdio.h> 
#include <stdlib.h> 

int n, i, a; 
int main() 
{ 
    int tab[n]; 

    printf("\nhow many elements you want to have?\n"); 
    do 
    { 
     scanf ("%d", &n); 
     if ((n>30 || n<1)) 
      printf("\ntoo high or too low\n");   
    } 
    while ((n<1 || n>30)); 
    printf("\nyour number please:\n"); 
    for(i = 0; i < n; i++) 
    { 
     do 
     { 
      printf("\nelement %d:", i+1); 
       scanf("%d", &a); 
      if ((a < 1 || a > 100)) 
       printf("\nnumber too high or too low\n"); 
      tab[i]=a; 
     } 
     while((a < 1 || a > 100)); 
    } 
    printf("\nyour numbers:"); 
    for (i=0; i<n; i++) 
    { 
     printf("\n%d", tab[i]); 
    } 

    int min = tab[0]; 
    int max = tab[0]; 
    for (i = 0; i<n; i++) 
    { 
     if (tab[i]> max) 
     max = tab[i]; 
     if(tab[i]< min) 
     min = tab[i]; 
    } 
    printf("\nsmallest: %d", min); 
    printf("\nbiggest: %d", max); 
} 
+0

'int tab [n];' <- скажите, что означает 'n', когда компьютер выполняет эту строку? – immibis

+0

Предупреждения компилятора Enasble! Затем прочитайте их, поймите и исправьте свой код. – Olaf

ответ

1

Проблема здесь это заявление:

int tab[n]; 

Вы объявляете переменную массив длины (выпускаются с C99) с неинициализированным значением, как длина. Я понимаю, что вы хотите освободить место для чисел, которые вы собираетесь хранить от stdin, но это не правильный способ сделать это.

Я вижу два решения:

  • легких один, выбрать максимальное фиксированное количество чисел (что происходит в вашей ситуации, так как вы позволяете максимум 30 значений) и изменить декларацию int tab[30]
  • использование динамически распределяемой памяти, например, посмотрите here
+1

Глобальные переменные инициализируются нулем, поэтому он объявляет массив длиной 0. – immibis

-1

вы должны specife вашу длину массива в C

tab[100]; 
+1

Пожалуйста, сделайте некоторое исследование и узнайте о * массивах переменной длины *, прежде чем писать фактически неверные ответы. – fuz

0

Если вы добавите printf("%d",sizeof tab); после объявления int tab[n], программа выведет 0.

Вы писали int n; вне main(), что делает его глобальной переменной, которая инициализируется в ноль по умолчанию, но вы не дали ему другое значение , прежде чем использовать его в операторе int tab[n];, так что равно int tab[0] в ваш случай.

Чтобы использовать VLA, вы должны объявить tab[n]послеn задается пользователем.

Эта ошибка вызывает неопределенное поведение, позволяя чему-либо случиться. Таким образом, ваша программа может потерпеть крах, когда вы вводите второй номер, или он никогда не будет терпеть крах, если вам действительно удастся. Номер 7 не обладает магической силой.

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