scanf seg故障,它不应该

时间:2016-03-12 02:23:03

标签: c

我真的找不到这个功能的错误,请帮忙!它在scanf中区分错误。它应该在队列中插入一个实现为循环缓冲区的元素:

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

int n, front, rear;
int A[100];

#define True 1
#define False 0
#define UNDERFLOW -1589

int insert(void);
int delete(void);

int main(void)
{
    int option;

    //Unos i error checking
    printf("Unesite kapacitet bafera:");

    while(True)
    {
        if (scanf("%d", &n) != 0)
        {
            if (n > 0 && n < 100)
            {
                break;
            }
            else
            {
                printf("Kapacitet je ceo broj izmedju 0 i 100, pokusajmo ponovo");
                continue;
            }
        }
        else
        {
            printf("Kapacitet je ceo broj izmedju 0 i 100");
            return 1;
        }
    }


    front = n;
    rear = n;

    while(True)
    {
        printf("\n\n IZABERITE OPCIJU \\n\n");
        printf("1 DODAJ ELEMENT\n");
        printf("2 UKLONI ELEMENT\n");
        printf("3 OCITAJ ELEMENT NA POCETKU REDA\n");
        printf("4 PRIKAZI BROJ ZAUZETIH MESTA\n");
        printf("5 PRIKAZI MAKSIMALNI KAPACITET REDA\n");
        printf("6 IZLAZ\n");

        scanf("%d", option);

        switch(option)
        {
            case 1: insert(); break;
            case 2: delete(); break;
//          case 3: pop(); break;
//          case 4: space_left(); break;
//          case 5: capacity(); break;
//          case 6: return 0; break;
            default: printf("Pogresan unos!"); break;
        }

    }

}

/**
 * Ubacivanje u red.
 * Vrednosti koje funkcija vraca:
 * 0-element je uspesno ubacen
 * 1-overflow
 * 2-pogresan unos
 */
int insert(void)
{
    int h;
    printf("Unesite broj koji treba dodati:");

    scanf("%d", &h);

//      if (scanf("%d", &h) != 0)
//      {
//          printf("Morate uneti ceo broj!");
//          return 2;
//      }
    rear = rear % n + 1;
    if (front == rear)
    {
        return 1; //overflow
    }
    else
    {
        A[rear] = h;
        return 0;
    }
}

/**
 * Brise element iz reda i vraca njegovu vrecdnost.
 * Ako vrati UNDERFLOW, znaci da je overflow
 */
int delete(void)
{
    int x;

    if (front == rear)
    {
        return UNDERFLOW;
    }
    else
    {
        x = A[front];
        front = front % n + 1;
        return x;
    }
}

我收到此消息:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a6d0d5 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7fffffffdc88, errp=errp@entry=0x0) at vfscanf.c:1826
1826    vfscanf.c: No such file or directory.

2 个答案:

答案 0 :(得分:2)

你应该改变: scanf("%d", option);scanf("%d", &option);

你使用了unitialized int作为指针,它可以指向任何地方,这就是你出现分段错误的原因

答案 1 :(得分:0)

第56行 中,您应该更改语句

scanf("%d", option);scanf("%d", &option);

当我运行你的代码时,我收到了以下警告:

stackOv.c: In function ‘main’: stackOv.c:56:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=] scanf("%d", option);

我马上去了这条线,我修好了,它开始运行得很完美:)。我希望这能解决问题。