如何使用C中的数组将字符串存储在堆栈中?

时间:2017-12-10 12:33:59

标签: c arrays stack

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

#define max 100

int a[max];
int top = -1;
char x;

int isempty() ;
int isfull() ;
void push() ;
int pop() ;
void display() ;

void main()
{
    int ch;

    do
    {

        printf("\n 1. Push");
        printf("\n 2. Pop");
        printf("\n 3. Display");
        printf("\n 4. Exit");
        scanf("%d",&ch);

    switch (ch) {
        case 1:
            push();
            break;
        case 2:
            pop();
            break;
        case 3:
            display();
            break;
        case 4:

            break;
        default:
            printf("Invalid Choice");
            break;
        }
    }while(ch!=4)
}

int isfull(){
if ( (top == max-1))
{
    return 1;
}
else
{
    return 0;
}
}

int isempty(){
if((top==-1))
{
    return 1;
}
else
{
    return 0;
}
}

void push(){
if (isfull())
{
    printf("Stack is full");
}
else
{
    printf("Enter element to add");
    scanf("%s",x);
    top++;
    strcpy(a[top],x);
    }
}

int pop(){
if(isempty())
{
    printf("Stack is empty");
    exit(0);
}
else{
    strcpy(x,a[top]);
    printf("%s",x);
    top --;
    }
}

void display()
{
if(isempty())
{
    printf("NO data to display");
    exit(0);
}
else
{
    int i;
    for(i=0;i<top+1;i++)
    {
        printf("%s \n",a[i]);
        }
    }
}

在运行推送操作时,它会以非零错误退出而不执行任何操作。

我们必须使用数组和推送和放大器将字母数字值添加到堆栈中。流行。 它应接受一个字符串值,并在选择显示时将其存储在堆栈数组中,它应显示所有值。

有人可以帮我纠正这段代码中的错误,说明为什么它没有为字符串分配或存储任何值。

1 个答案:

答案 0 :(得分:2)

这个答案提供了OP在使用上面发布的代码时遇到的所有问题。解决方案的第一部分提供了对这些错误的分析以及如何处理它们。第二部分提供了OP想要实现的解决方案。 (将字符串存储在堆栈中)。

您正在访问未初始化的变量,并将其垃圾值与4进行比较。我建议do-while

 do{
    printf("\n 1. Push");
    printf("\n 2. Pop");
    printf("\n 3. Display");
    printf("\n 4. Exit");
    scanf("%d",&ch);
 ....

 }while(ch!=4);

这个想法很简单。我们正在ch获得一个输入并完成所有工作。比较是在所有工作结束时完成的。因此,我们始终使用确定的ch值。

早些时候,您的问题似乎是ch中的垃圾值不等于4。这就是它甚至没有进入循环的原因。

您已将程序中的每个变量都设为全局变量。当你得到一个我们必须追踪数据突变的bug时,将会理解调试这个问题的真正痛苦。 不要使用这样的全局变量。

重大错误

永远不能将字符串存储在int数组中。

scanf("%s",x); This is wrong.

您正在使用%s说明符输入字符。您应该使用%c。然后,你不能使用strcpy()来复制它。

此外,您不需要strcpy(),您只需使用aissgnment即可。 您可以将char存储在int变量和int数组中。

更正的代码是(push()函数):

if( scanf(" %c",&x) == 1){
   a[++top]=x;
}

pop()函数中使用

的方式相同
x = a[top--];
printf("%c",x);

同样在display()功能中,您需要更改

printf("%c \n",a[i]);

再次,如果您确定只使用字符,为什么不使用char数组。

这里char a[100]非常适合。

这些是您的程序生成的错误/警告列表(不使用任何标志)

main.c: In function ‘main’: main.c:48:1: error: expected ‘;’ before ‘}’ token  }  ^ main.c: In function ‘pop’: main.c:93:12: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
     strcpy(x,a[top]);
            ^ In file included from main.c:2:0: /usr/include/string.h:125:14: note: expected ‘char * restrict’ but argument is of type ‘char’  extern char *strcpy (char *__restrict
__dest, const char *__restrict __src)
              ^~~~~~ main.c:93:14: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
     strcpy(x,a[top]);
              ^ In file included from main.c:2:0: /usr/include/string.h:125:14: note: expected ‘const char * restrict’ but argument is of type ‘int’  extern char *strcpy (char *__restrict
__dest, const char *__restrict __src)
              ^~~~~~ main.c: In function ‘main’: main.c:114:1: error: expected declaration or statement at end of input  }  ^

使用标志作为alk表示错误和警告将更多。

为了存储字符串,您需要考虑使用2d char数组。这是实现字符串的一种方法。

代码

(仅供参考。仅包含更改。代码具有最小/无错误检查。)

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

#define max 100

char a[max][max];
int top = -1;
char x[max];

int isempty() ;
int isfull() ;
void push() ;
int pop() ;
void display() ;

int main()
{
    int ch;

    do
    {

        printf("\n 1. Push");
        printf("\n 2. Pop");
        printf("\n 3. Display");
        printf("\n 4. Exit\n");
        scanf("%d",&ch);

        switch (ch) {
        case 1:
            push();
            break;
        case 2:
            pop();
            break;
        case 3:
            display();
            break;
        case 4:

            break;
        default:
            printf("Invalid Choice");
            break;
        }
    }while(ch!=4);
    return 0;
}

int isfull(){
    if ( (top == max-1))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int isempty(){
    if((top==-1))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void push(){
    if (isfull())
    {
        printf("Stack is full");
    }
    else
    {
        printf("Enter element to add");
        scanf("%s",x);
        top++;
        strcpy(a[top],x);
    }
}

int pop(){
    if(isempty())
    {
        printf("Stack is empty");
        exit(0);
    }
    else{
        strcpy(x,a[top]);
        printf("%s",x);
        top--;
    }
}

void display()
{
    if(isempty())
    {
        printf("NO data to display");
        exit(0);
    }
    else
    {
        int i;
        for(i=0;i<top+1;i++)
        {
            printf("%s \n",a[i]);
        }
    }
}

在此解决方案中,我们使用了两个主要更改

解释

char x转换为char x[max],并将aint [max]更改为char a[max][max]。现在这样做可以存储空终止的char数组。 2d字符数组用于实现此处的堆栈。