c - scanf 段错误,它不应该

标签 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.

最佳答案

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

你使用单元化的 int 作为指针,它可以指向任何地方,这就是你遇到段错误的原因

关于c - scanf 段错误,它不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953007/

相关文章:

标准的字符串文字和字符串文字?

c - 内部引导加载程序 ARM cortex M4 NRF52 芯片

c++ - C/C++如何在一次函数调用中交出const函数指针或简单指针

c - 如何在 C 中解析单行输入中的三元组

c - 使用结构体分配内存时出现段错误

c - 修改抓包包头

c - 如何使用USB转RS232转换器打开COM端口?

c - 从文件读入结构,使用 C

c - C语言链表中的节点

C 找不到在不同情况下从文件读取数据的工作算法