如何将带有指针变量的元素扫描到数组中

时间:2013-09-27 10:55:11

标签: c visual-studio scanf

我正在使用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的使用是否正确?

3 个答案:

答案 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);