如何读取存储在char数组中的值?

时间:2016-10-07 12:44:56

标签: c arrays data-structures stack

这里我试图实现一个堆栈,只会从字符串中打开大括号并将其存储在数组中。我写的代码将值存储在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 个答案:

答案 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}以将数组初始化为零。