2016-10-07 3 views
2

Здесь я пытаюсь реализовать стек, где только отрывные фигуры из строки будут отфильтрованы и сохранены в массиве. Код, который я написал, сохранил значения в массиве stackArr. Но всякий раз, когда я пытаюсь распечатать массив, мой код не работает. Он не дает никакого конкретного сообщения об ошибке, он просто не выполняется.Как читать значения, хранящиеся в массиве символов?

Я думаю, что проблема заключается в следующем участке:

i = 0; 
while(stackArr[i] != '\0') 
{ 
    printf("%c ",stackArr[i]); 
    i++; 
} 

Полный код:

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

int main() 
{ 
    char braces[10]; 
    char stackArr[10]; 
    int front = -1,rear = -1,size = 10; 
    gets(braces); 
    checkValidate(&braces,&stackArr,&front,&rear,size); 
} 

void checkValidate(char *braces,char *stackArr,int *front,int *rear,int size) 
{ 
    int i = 0; 
    while(braces[i] != '\0') 
    { 
     if((braces[i] == '(') || (braces[i] =='{') || (braces[i] =='[')) 
     { 
      push(braces[i],&stackArr,&front,&rear,size); 
     } 
     i++; 
    } 
    //print(&front,&rear,size,*stackArr); 
    i = 0; 
    while(stackArr[i] != '\0') 
    { 
     printf("%c ",stackArr[i]); 
     i++; 
    } 
} 

void push (char val,char *stackArr,int *front,int *rear,int size) 
{ 
    if(isFull(*front,*rear,size)) 
    { 
     printf("your string is larger that valid size\n"); 
    } 
    else 
    { 
     if(isEmpty(*front,*rear)) 
     { 
      *front = 0; 
     } 
     *rear = (*rear+1) % size; 

     stackArr[*rear] = val; 
     /*printf("%d ",*rear); 
     printf("%c",stackArr[*rear]); 
     printf("\n");*/ 
    } 
} 

int isEmpty(int front,int rear) 
{ 
    if(front == -1 && rear == -1) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

int isFull(int front,int rear,int size) 
{ 
    if(front == 0 && rear == size -1) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

void print(int *front,int *rear,int size,char *arr) 
{ 
    int i; 
    for(i = *rear;i != *front; i = (i-1)% size) 
    { 
     printf("%c\n",arr[i]); 
    } 
    printf("%c\n",arr[i]); 
} 
+1

Какие данные вы вводите в качестве входных данных? – dasblinkenlight

+0

Выражение '& braces' does * not * дает вам указатель на' char', он дает указатель на * массив * из десяти элементов 'char'. Очень разные. И что-то, что компилятор должен был поймать за вас, если вы только запомнили создать объявление прототипа функции, прежде чем вы вызвали функцию. Как и сейчас, вы все равно должны получать предупреждения. –

+0

@dasblinkenlight предоставил пользовательский ввод типа "[{}]" –

ответ

4

Ваш код должен производить много предупреждений о компиляции, потому что функции, которые вы не требует передовых деклараций. Следовательно, компилятор предполагает, что все функции, которые вы вызываете, имеют параметры типа int и что они также возвращают int. Так как ваши функции принимают указатели вместо этого, вызовы ваших функций приводят к неопределенному поведению, что, вероятно, приводит к сбою.

// Put these declarations in front of main 
void checkValidate(char *braces,char *stackArr,int *front,int *rear,int size); 
void push (char val,char *stackArr,int *front,int *rear,int size); 
int isEmpty(int front,int rear); 
int isFull(int front,int rear,int size); 
void print(int *front,int *rear,int size,char *arr); 

Добавление форвардных деклараций должно решить эту проблему. Кроме того, вам необходимо заменить вызов устаревших gets с вызовом fgets, который безопасен из переполнения буфера.

Вы также передаете указатели на массивы в функции, которые ожидают указателей на символ. Вам необходимо удалить & перед braces и stackArr. Включите предупреждения компилятора, чтобы увидеть все места, где это необходимо сделать.

И, наконец, ваш код ожидает, что stackArr будет пустым, но вы никогда не устанавливаете его элементы в нули. Добавьте char stackArr[10] = {0} для инициализации массива нулями.

+0

Я добавил это, но это не исправить мою проблему :( –

+0

В качестве альтернативы переместите 'int main (void)' в нижнюю часть файла и определите функции в правильном порядке –

+0

@ AL-zami Пожалуйста, взгляните на редактирование. Это дает вам [некоторый результат] (http://ideone.com/S49EJa), не уверен, что это то, что вы хотели видеть, но по крайней мере он больше не сбой. – dasblinkenlight

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