简体   繁体   English

堆栈和队列程序中的分段错误

[英]Segmentation fault in stack and queue program

This code is supposed to allow the user to switch between stack and queue at will. 该代码应允许用户随意在堆栈和队列之间切换。 The issue I am facing at the moment is after I start the program it will ask for q or s like it is supposed to. 我目前面临的问题是,在启动程序后,它将按要求输入q或s。 But once you actually put in your input it will give a segmentation fault. 但是,一旦您实际输入了内容,就会出现细分错误。 Anyone know what I can do to solve this? 有人知道我该怎么做吗?

#include <stdio.h>
#include <stdlib.h>
struct node{
    int info;
    struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
        int stk[10];
        int top;
} s;

void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
void main(){
char ch;
        printf("\n s - Switch to stack mode");
        printf("\n q - Switch to queue mode");
    create();
        while(1)
                {
                printf("\nWhat mode would you like to start in?\n");
                scanf("%s", ch);
                switch (ch){
                        case 's':
                                stack();
                                break;
                        case 'q':
                                queue();
                                break;
                        }
                }
return;
}
void create(){/* Create an empty queue */
    front = rear = NULL;
}
void queue(){
int no, e;
char ch;

    printf("\n s - Switch to stack mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n Q - Exit program");
        printf("\n h - Help");
while(1){
        printf("\n What would you like to do?\n");
        scanf("%s", ch);
        switch (ch)
        {
                case 's':
                        stack();
                        break;
                case 'i':
                        printf("Enter data : ");

                         scanf("%d", &no);
                        insertq(no);
                        break;
                case 'p':
                        removeq();
                        break;
                case 'Q':
                        printf("\nGoodbye");
                        exit;
                case 'h':
                        help();
                        break;
}
}
return;
}
void stack(){
int no, e;
char ch;

    printf("\n q - Switch to queue mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n Q - Exit program");
        printf("\n h - Help");
while(1){
        printf("\n What would you like to do?\n");
        scanf("%s", ch);
        switch (ch)
        {
                case 'q':
                        queue();
                        break;
                case 'i':

                        push();
                        break;
                case 'p':
                        pop();
                        break;
                case 'Q':
                        printf("\nGoodbye");
                        exit;
                case 'h':
                        help();
                        break;
}}
return;
}
void push (){
    int num;

    if (s.top == (9))
    {
        printf ("Error: Overflow\n");
    }
    else
    {
        printf ("Enter the element to be pushed\n");
        scanf ("%d", &num);
        s.top = s.top + 1;
        s.stk[s.top] = num;
    }
}
void pop(){
    int num;
    if (s.top == - 1)
    {
        printf ("Error: Stack Empty\n");

    }
    else
    {
        num = s.stk[s.top];
        printf ("popped element is = %d\n", num);
        s.top = s.top - 1;
    }
}
void insertq(int data){
    if (rear == NULL)
    {
        rear = (struct node *)malloc(1*sizeof(struct node));
        rear->ptr = NULL;
        rear->info = data;
        front = rear;
    }
    else
    {
        temp=(struct node *)malloc(1*sizeof(struct node));
        rear->ptr = temp;
        temp->info = data;
        temp->ptr = NULL;

        rear = temp;
    }
    count++;
}
void removeq(){
    front1 = front;

    if (front1 == NULL)
    {
        printf("\n Error: Trying to display elements from empty queue");
        return;

    }
    else
        if (front1->ptr != NULL)
        {
            front1 = front1->ptr;
            printf("\n Dequed value : %d", front->info);
            free(front);
            front = front1;
        }
        else
        {
            printf("\n Dequed value : %d", front->info);
            free(front);
            front = NULL;
            rear = NULL;
        }
        count--;
}

void printq(){
    front1 = front;

    if ((front1 == NULL) && (rear == NULL))
    {
        printf("Queue is empty");
        return;
    }
    while (front1 != rear)
    {
        printf("%d ", front1->info);
        front1 = front1->ptr;
    }
    if (front1 == rear)
        printf("%d", front1->info);

        printf("%d", front1->info);
}
void help(){
        printf("\n q - switch to queue mode");
        printf("\n s - Switch to stack mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n e - Tells if empty or not");
        printf("\n Q - Exit program");
        printf("\n h - Help");
}

This scanf("%s", ch); 这个scanf("%s", ch); leads to your seg fault. 导致您的段错误。 Change it scanf("%c", &ch); 更改为scanf("%c", &ch); . Correct this in all methods. 在所有方法中都应对此进行更正。 Also place the code like this to eat up trailing new line in buffer after your scanf calls: 同样在您的scanf调用之后,将这样的代码放在缓冲区的尾部换掉新行:

scanf("%c", &ch);
char c;
while((c = getchar()) != '\n' && c != EOF);

Full code: 完整代码:

#include <stdio.h>
#include <stdlib.h>
struct node{
    int info;
    struct node *ptr;
}*front,*rear,*temp,*front1;
struct stack
{
        int stk[10];
        int top;
} s;

void push();
void pop();
void emptys();
void search();
void queue();
void stack();
void insertq(int data);
void removeq();
void emptyq();
void printq();
void create();
void help();
int count = 0;
int main(){
char ch;
        printf("\n s - Switch to stack mode");
        printf("\n q - Switch to queue mode");
    create();
        while(1)
                {

                printf("\nWhat mode would you like to start in?\n");
                scanf("%c", &ch);
                char c;
                while((c = getchar()) != '\n' && c != EOF);
                switch (ch){
                        case 's':
                                stack();
                                break;
                        case 'q':
                                queue();
                                break;
                        }
                }
return;
}
void create(){/* Create an empty queue */
    front = rear = NULL;
}
void queue(){
int no, e;
char ch;

    printf("\n s - Switch to stack mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n Q - Exit program");
        printf("\n h - Help");
while(1){
        printf("\n What would you like to do?\n");
        scanf("%c", &ch);
        char c;
        while((c = getchar()) != '\n' && c != EOF);
        switch (ch)
        {
                case 's':
                        stack();
                        break;
                case 'i':
                        printf("Enter data : ");

                         scanf("%d", &no);
                        insertq(no);
                        break;
                case 'p':
                        removeq();
                        break;
                case 'Q':
                        printf("\nGoodbye");
                        exit;
                case 'h':
                        help();
                        break;
}
}
return;
}
void stack(){
int no, e;
char ch;

    printf("\n q - Switch to queue mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n Q - Exit program");
        printf("\n h - Help");
while(1){
        printf("\n What would you like to do?\n");
        scanf("%c", &ch);
        char c;
        while((c = getchar()) != '\n' && c != EOF);
        switch (ch)
        {
                case 'q':
                        queue();
                        break;
                case 'i':

                        push();
                        break;
                case 'p':
                        pop();
                        break;
                case 'Q':
                        printf("\nGoodbye");
                        exit;
                case 'h':
                        help();
                        break;
}}
return;
}
void push (){
    int num;

    if (s.top == (9))
    {
        printf ("Error: Overflow\n");
    }
    else
    {
        printf ("Enter the element to be pushed\n");
        scanf ("%d", &num);
        s.top = s.top + 1;
        s.stk[s.top] = num;
    }
}
void pop(){
    int num;
    if (s.top == - 1)
    {
        printf ("Error: Stack Empty\n");

    }
    else
    {
        num = s.stk[s.top];
        printf ("popped element is = %d\n", num);
        s.top = s.top - 1;
    }
}
void insertq(int data){
    if (rear == NULL)
    {
        rear = (struct node *)malloc(1*sizeof(struct node));
        rear->ptr = NULL;
        rear->info = data;
        front = rear;
    }
    else
    {
        temp=(struct node *)malloc(1*sizeof(struct node));
        rear->ptr = temp;
        temp->info = data;
        temp->ptr = NULL;

        rear = temp;
    }
    count++;
}
void removeq(){
    front1 = front;

    if (front1 == NULL)
    {
        printf("\n Error: Trying to display elements from empty queue");
        return;

    }
    else
        if (front1->ptr != NULL)
        {
            front1 = front1->ptr;
            printf("\n Dequed value : %d", front->info);
            free(front);
            front = front1;
        }
        else
        {
            printf("\n Dequed value : %d", front->info);
            free(front);
            front = NULL;
            rear = NULL;
        }
        count--;
}

void printq(){
    front1 = front;

    if ((front1 == NULL) && (rear == NULL))
    {
        printf("Queue is empty");
        return;
    }
    while (front1 != rear)
    {
        printf("%d ", front1->info);
        front1 = front1->ptr;
    }
    if (front1 == rear)
        printf("%d", front1->info);

        printf("%d", front1->info);
}
void help(){
        printf("\n q - switch to queue mode");
        printf("\n s - Switch to stack mode");
        printf("\n i - Insert a new number");
        printf("\n p - Remove front of queue or top of stack");
        printf("\n e - Tells if empty or not");
        printf("\n Q - Exit program");
        printf("\n h - Help");
}

Instead of scanf(%d", &ch) you can use ch = getchar() which will read single character and you can use switch statement to process the input. 代替scanf(%d“,&ch),可以使用ch = getchar()来读取单个字符,并且可以使用switch语句来处理输入。

while(1)
{
    printf("Enter you choice");
    ch = getchar();
    switch(ch)
    {
        case 's':
        stack();
        break;

        default :
        printf("Invalid input \n");
        help();
        break;
    }
}

In above code default is optional but used for error handling. 在上面的代码中,default是可选的,但用于错误处理。

Thanks, 谢谢,
Sudhir 苏迪尔

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM