2013-08-13 2 views
0

Ну, у меня есть этот простой код, он спрашивает у пользователя, сколько номеров он хочет сохранить, затем он запрашивает цифры, каждый раз, когда пользователь записывает номер, программа печатает уже написанные цифры и он сортирует числа от самого низкого до самого высокого.C program keep crashing

Проблема заключается в том, что пользователь говорит программе, чтобы сохранить более 9 номеров, программы просто останавливаются, если пользователь хочет сохранить 8 или меньше номеров, он отлично работает. я не знаю, Что происходит, я ценю вашу помощь

Переменные и другие термины основаны на моем языке, испанский, вот некоторые переводы:

функции guardaNum: сохраняет число в массиве

функция ОРДЕН: номер SORT массива

функция imprime: печатает массив со

Контадора: счетчик

cant: количество, которое пользователи хотят сохранить

Спасибо за помощь!

#include <stdio.h> 
int guardaNum(int *pnum,int lista[],int *pcontador); 
int ordena(int lista[],int *pcontador); 
void imprime(int lista[],int *pcant); 

int main(void) 
{ 
    int cant, num, *pnum, lista[cant], i,contador,*pcontador ; 
    printf("Ingrese la cantidad de numeros que desea agregar a la lista: \n"); 
    scanf("%d", &cant); 

    for(i=0;i<cant;i++) 
    { 
     lista[i]=-99; 
    } 

    for(i=0;i<cant;i++) 
    { 
     printf("Ingrese un Numero: "); 
     scanf("%d",&num); 

     pnum=&num; 
     contador=i; 
     pcontador=&contador; 

     guardaNum(pnum,lista,pcontador); 
     ordena(lista,pcontador); 
     imprime(lista,pcontador); 
    } 

} 

int guardaNum(int *pnum,int lista[],int *pcontador) 
{ 
    lista[*pcontador]=*pnum; 
    return 0; 

} 

int ordena(int lista[], int *pcontador) 
{ 
    int i,j, temp; 

    for(j=0;j<*pcontador;j++) 
    { 
     for(i=0;i<*pcontador;i++) 
    { 

     if(lista[i]>lista[i+1]) 
     { 
      temp=lista[i+1]; 
      lista[i+1]=lista[i]; 
      lista[i]=temp; 
     } 
    } 
    } 
} 

void imprime(int lista[],int *pcontador) 
{ 
    int i; 
    for(i=0;i<=*pcontador;i++) 
    { 
     printf("%d\n",lista[i]); 
    } 
} 
+2

Вы использовали отладчик? Если нет, почему бы и нет? –

+0

Когда вы создаете массив 'lista', вы используете неинициализированную переменную' cant'. Вы должны сначала задать количество чисел, а затем выделить достаточное количество памяти для хранения чисел. http://linux.die.net/man/3/malloc – koopajah

+0

Нет, я не знаю, как это использовать, я должен научиться этому в этом семестре, но не сейчас – Rafaalvfe

ответ

1

сделать это:

int main(void) 
{ 
    int cant, num, *pnum, i,contador,*pcontador ; 
    int *lista; 
    printf("Ingrese la cantidad de numeros que desea agregar a la lista: \n"); 
    scanf("%d", &cant); 
    lista = malloc(sizeof(int)*cant); 
    if(!lista){ 
    perror("error on malloc"); 
    exit(1); 
    } 

    //continue with your code 
    free(lista); 
} 

Проблема с кодом, это косяк не инициализирован так что компилятор не знает, сколько места требуется для вашего массива.

или вы можете сделать это следующим образом:

scanf("%d", &cant); 
int lista[cant] 
//continue with your code 
+1

Возможно, было бы неплохо поставить 'free (lista);' до конца 'main()' в первом примере, по крайней мере, для поощрения хороших привычек. –

+0

@FredLarson Отличная идея. Особенно для кого-то нового подобного. –

1

В этой строке:

int cant, num, *pnum, lista[cant], i,contador,*pcontador ; 

Вы используете cant пока он не инициализирован. Вам нужно будет переместить ваше объявление lista, чтобы после ввода размера.

+0

спасибо! Я не заметил этого – Rafaalvfe

+0

@ Rafaalvfe: De nada. –

1

Обратите внимание, что вы определяете массив с «cant» размером до, вы фактически принимаете его как вход. Вам понадобится максимальный размер массива (и лучше проверьте свой ввод против него), или если вы знаете, как - распределить массив динамически