我正在使用visual studio 2012。
我正在尝试使用单个阵列实现2个堆栈。
我的C代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[10], ch=1, *top1=&arr[0]-1, *top2=&arr[9]+1;
while(ch!=5)
{
printf("1. Push in Stack 1\n2. Pop from Stack 1\n3. Push in Stack 2\n4. Pop from Stack 2\n5.Exit");
scanf("%d",&ch);
switch(ch)
{
case 1:
if(top1+1 !=top2)
{
scanf("%d",*++top1);
}
else
printf("stack is full");
break;
case 2:
if(top1 != &arr[0]-1)
printf("%d",*top1);
else
printf("Stack is Empty");
break;
case 3:
if(top2-1 !=top1)
{
scanf("%d",*--top2);
}
else
printf("stack is full");
break;
case 4:
if(top2 != &arr[9]+1)
printf("%d",*top2);
else
printf("Stack is Empty");
break;
case 5:
return(0);
}
}
return 0;
}
代码运行正常,scanf("%d",*++top1);
和scanf("%d",*--top2);
不是
接受输入。
scanf的使用是否正确?
答案 0 :(得分:3)
你应该认真考虑警告,你忽略了:
warning: format ‘%d’expects type ‘int *’, but argument 2 has type ‘int’
代码行scanf("%d", *++top1);
和scanf("%d", *--top2);
。
因为带有scanf()
格式字符串的%d
接受的地址不是值。因此,例如,表达式*++top1
的值被视为不是有效地址的地址,因此这会在运行时导致未定义的行为。删除*
中的解除引用scanf()
指针,它将起作用。
答案 1 :(得分:1)
scanf()
需要第二个和第三个参数的地址
如果您传递的是值而不是地址,则会收到以下警告
warning: format â%dâ expects argument of type âint *â, but argument 2 has type âintâ [-Wformat]
像这样MOdify
scanf("%d",*++top1); ==> scanf("%d",++top1);
scanf("%d",*--top2); ==> scanf("%d",--top2);
修改强>
您的POP实施不正确
1. pop1 you need to decrement top1
2. pop2 you need to increment top2
答案 2 :(得分:0)
在scanf()
中,您只需要传递存储输入的内存地址。
但是你要取消引用它。
例如。
变化
scanf("%d",*++top1);
到
scanf("%d",++top1);