Простая программа стека, не принимающая ввод и сбой - PullRequest
0 голосов
/ 18 июня 2019

Я изучаю стеки прямо сейчас, и я решил попытаться создать небольшую программу с использованием стека из правил Magic the Gathering, которая также следует порядку LIFO.

Пользователь спросил, хотели бы они

  1. разыграть заклинание (толчок)
  2. разрешить заклинание (поп) или
  3. выйти.

Теперь сложность состоит в том, что я пытаюсь разрешить элементам стека составлять несколько слов каждое.Это вызывает много проблем.

Я могу ввести слово и распечатать его вне цикла while(1), но если я помещу его внутрь, все становится бесполезным.Есть идеи?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100

typedef struct {
  char item[SIZE];
  int top;
} stack;

void init(stack*);
void push(stack*, char[]);
char pop(stack*);

void init(stack* st) { 
  st->top = -1; 
}

void push(stack* st, char* value) {
  if (st->top == SIZE - 1) {
    printf("STACK OVERFLOW\n");
    return;
  }
  st->top++;
  strcpy(st->item[st->top], value);
}

char pop(stack* st) {
  if (st->top == -1) {
    printf("STACK UNDERFLOW\n");
    return -1;
  }
  char value;
  strcpy(value, st->item[st->top]);
  st->top--;
  return value;
}

int main() {
  stack st1, st2;
  int choice;
  char val[20];
  init(&st1);
  init(&st2);

  printf("You have priority. What would you like to do?\n\n");
  printf("1. Cast a spell\n2. Resolve the next spell\n3. Pass priority\n\n");

  while (1) {
    scanf("%d", &choice);
    switch (choice) {
      case 1:
        printf("What is the spell?\n\n");
        scanf("%[^\n]s", val);
        printf("%s", val);
        push(&st1, val);
      case 2:
        strcpy(val, pop(&st1));
        printf("%s resolves.\n\n", val);
      case 3:
        exit(0);
    }
  }
  return 0;
}

1 Ответ

0 голосов
/ 19 июня 2019

Причина, по которой вы будете получать ошибки, заключается в том, что из-за преобразования типов.

char pop(stack* st) {
  if (st->top == -1) {
    printf("STACK UNDERFLOW\n");
    return -1;
  }
  char value;
  strcpy(value, st->item[st->top]);
  st->top--;
  return value;
}

Во-первых, вам не нужно передавать адрес при работе с массивами. Другое дело, что вы пытаетесь скопировать всю строку в одну символьную переменную. Итак, в вашем коде столько проблем с преобразованием типов.

Я предлагаю вам сделать функции типа данных void и обеспечить функциональность внутри блока функции. Просто вызовите функцию pop с верхним значением в качестве аргумента и напечатайте строку внутри функции, которую вы выводите. Стек - это структура данных нулевого порядка, поэтому он не требует ввода для всплывающей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...