我正试图通过使用一个数组来为creatin编写一个堆栈的代码,我倾向于使用动态内存分配。问题是它不是为了确定是否应该退出循环而对takin'scannin'进行响应。
#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);
}
}
示例输入:
数组大小:5
选择结果编号
1。推送元素
2.display elements
3.exit
1
输入数字 3
输入更多内容?
该程序在此之后退出,而不管ans的值如何。任何人都可以更正我的代码吗?
答案 0 :(得分:0)
你的代码退出了,因为getchar()读取\ n [enter]作为ans的字符 你的意见是
enter a number 3[enter]
所以
ans=getchar();
读取[enter]。所以一个简单的解决方案是使用getchar()两次
getchar();
ans=getchar();
您的代码将继续有效
答案 1 :(得分:0)
你可以添加这一行
fseek(stdin,0,SEEK_END);
在每个getchar之前,以确保它不会读取任何先前的字符。它基本上清除缓冲区,或者更确切地说,将读取点移动到缓冲区的末尾。