这里我试图实现一个堆栈,只会从字符串中打开大括号并将其存储在数组中。我写的代码将值存储在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]);
}
答案 0 :(得分: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}
以将数组初始化为零。