C 使用数组创建堆栈

C 使用数组创建堆栈,c,arrays,stack,C,Arrays,Stack,我正试图通过使用数组来编写创建堆栈的代码,有人建议我使用动态内存分配。问题在于,它没有“扫描”决定是否应该退出循环的响应 #include<stdio.h> static int top, size, *a, x; stfull(){ if(top<size) x = 0; else x = 1; } stempty(){ if(!top) x = 1; else x = 0; } push(int z){ if(x){

我正试图通过使用数组来编写创建堆栈的代码,有人建议我使用动态内存分配。问题在于,它没有“扫描”决定是否应该退出循环的响应

#include<stdio.h>

static int top, size, *a, x;

stfull(){
    if(top<size) x = 0;
    else x = 1;
}

stempty(){
    if(!top) x = 1;
    else x = 0;
}

push(int z){
    if(x){
        printf("stack full\tstack overflow\n");
        return;
    }
    else{
        a[top] = z;
        top++;
        return;
    }
}

pop(){
    if(x){
        printf("empty stack\tstack underflow\n");
        return;
    }
    else{
        printf("%d  ", a[top]);
        top--;
        return;
    }
}

main(){
    int num, res;
    char ans = 'y';

    printf("array size:\t");
    scanf("%d", &size);

    a = malloc(size*sizeof(int));

    printf("choose number for result\n1. push elements\n2.display elements\n3.exit\n");
    scanf("%d", &res);

    switch(res){
        case 1: 
            while(ans == 'y'){
                printf("enter a number\t");
                scanf("%d", &num);

                push(num);

                printf("enter more?\t");
                ans = getchar();
            }   
        break;
        case 2:
            do{
                pop();

                printf("pop more?\t");
                ans = getchar();
            }while(ans == 'y');
        break;
        case 3: 
            exit(1);
    }
}
#包括
静态int-top,大小*a,x;
stfull(){

如果(top您的代码退出,因为getchar()读取\n按下的[enter]作为ans的字符。
你的意见是

enter a number 3[enter]
所以

读取[enter]。因此,一个简单的解决方案是将getchar()用作

您的代码将继续工作

您可以添加此行

fseek(stdin,0,SEEK_END);

在每个getchar之前,当您希望确保它不读取任何前面的字符时。它基本上会清除缓冲区,或者更准确地说,会将读取点移动到缓冲区的末尾。

malloc()
仅用于在运行时分配内存。静态变量在编译时初始化。因此,您应该使用
if(!a)a=malloc(size*sizeof(int));
creatin',usin',takin',scannin:“g”有什么问题吗在你的键盘上?别忘了,当你请求一个字符时,缓冲区中会留下一个换行符,这基本上会跳过一些getchar语句。有趣的是,我以前(在解析器生成器中)见过这个“
void
作为隐式返回类型”但是我认为默认的隐式返回类型是
int
。在ANSI-C之前的某个时候它是否曾经
void
?您的
x
变量看起来很乱,您是否将其用作全局返回值?可怕的是..调用是可移植的。但是,您想要的效果可能不是。fseek()有太多的警告(在ISO标准中),当您添加各种操作系统,或者从文件或管道重定向stdin时,我怀疑您在所有情况下都不会得到想要的。
getchar();
ans=getchar();
fseek(stdin,0,SEEK_END);